我已經爲嵌入式系統編寫了一些C++代碼,它的工作方式類似於魅力。目前的任務是模擬PC上該設備的行爲。一些代碼必須移植:對於第一次測試,我使用的是mingw(g ++),而嵌入式系統是STM32並使用KEILμVision工具鏈。匿名命名空間導致此處未定義的引用 - 在此處工作
我遇到了一個與功能行爲沒有關係的問題,而不是編譯器特有的怪異問題。我在匿名命名空間中定義了2個類,因爲它們包含在整個項目中。現在在嵌入式設備上編譯並運行時沒有問題。 g ++抱怨一個未定義的參考!
當我刪除匿名命名空間的周圍它編譯和運行的類!但爲什麼?這裏是再現情況的一些示例代碼: main.cpp中:
#include "notmain.h"
#include "theclass.h"
A *ourA=NULL;
int main()
{
theA = new A();
theA->dostuff(1024);
sunshine sun;
sun.Init();
}
notmain.cpp:
#include "notmain.h"
#include "theclass.h"
void sunshine::Init()
{
theA->dostuff(127);
}
notmain.h:
#ifndef NOTMAIN_H_
#define NOTMAIN_H_
class sunshine
{
public:
void Init();
};
#endif
theclass.h:
#ifndef THECLASS_H_
#define THECLASS_H_
#include <stdio.h>
#define theA ourA
namespace
{
class A
{
public:
void dostuff(int b)
{
a = b;
printf("Hello: %d\n",a);
}
private:
int a;
};
}
extern A *ourA;
#endif
Compil er/Linker輸出: 09:09:57 **增量構建配置調試項目Testo ** 信息:內部構建器用於構建 g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -o main.o「.. \ main.cpp」 g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -o notmain.o「.. \ notmain.cpp」 g ++ -o Testo.exe notmain的.o main.o notmain.o:在功能ZN8sunshine4InitEv': D:\Projekte\Testo\Debug/../notmain.cpp:6: undefined reference to
大浦」 collect2.exe:錯誤:LD在返回退出狀態1
09:09:57 Build Finished (took 702ms)
刪除該命名空間解決了這個問題,但爲什麼它編譯,鏈接,工作KEIL?任何人都可以向我解釋這個嗎?
不要在頭文件中使用匿名命名空間 –
無論如何在頭文件中使用無名命名空間有什麼好處? +1順便寫出一個寫得很好的問題。 – OMGtechy
@OMGtechy:clambake的推理是「*匿名命名空間,因爲它們包含在整個項目中*」;但它是有缺陷的 - 匿名命名空間完全相反。 – Clifford