我在這裏有世界上最簡單的程序。我想可能會讓你們中的一些人花一秒鐘的時間來弄清楚什麼是錯的。將C++主要方法移到自己的文件時編譯時出錯
了foo.h:
#ifndef FOO_H
#define FOO_H
namespace foo
{
char str[ 20 ];
void bar(char* s);
}
#endif
Foo.cpp中:
#include "foo.h"
using namespace std;
namespace foo
{
void bar(char* s) {
return;
}
}
foo_main.cpp:
#include "foo.h"
using namespace std;
using namespace foo;
int main(void)
{
bar(str);
}
現在,當我嘗試這三個一起編譯:
g++ foo_main.cpp foo.cpp -o foo
/tmp/cc22NZfj.o:(.bss+0x0): multiple definition of `foo::str'
/tmp/ccqMzzmD.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
我想在命名空間foo中使用str作爲全局,所以需要留在那裏。如果我將我的主要方法移動到foo.cpp,那麼事情編譯得很好。如果我想將我的主要方法保留在單獨的文件中,該怎麼辦?正如你所看到的,我甚至在.h文件中加入了包含警衛的內容,這樣就不會與str發生衝突,但似乎並不奏效。怎麼了?
如果在同一個源文件**中包含'#include'd兩次相同的頭文件,則包含警衛幫助**。當一個頭文件定義了某些內容並被包含在多個源文件中時,它並沒有幫助。 –
對於一個該死的問好的問題+1。你可以減少更多,但我們不要挑剔。 –