2012-09-02 48 views
4

我在這裏有世界上最簡單的程序。我想可能會讓你們中的一些人花一秒鐘的時間來弄清楚什麼是錯的。將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發生衝突,但似乎並不奏效。怎麼了?

+0

如果在同一個源文件**中包含'#include'd兩次相同的頭文件,則包含警衛幫助**。當一個頭文件定義了某些內容並被包含在多個源文件中時,它並沒有幫助。 –

+0

對於一個該死的問好的問題+1。你可以減少更多,但我們不要挑剔。 –

回答

6

就像任何其他全局一樣,只要你需要使用它並在一個地方定義它就可以聲明它。因此在foo.h中,將其標記爲extern。然後在foo.cpp中定義它。

3

include指令將包含文件的內容逐字地包含到包含#include的文件中。因此你最終定義char str[ 20 ];這兩個 cpp文件,因此兩次。

extern char str[ 20 ]; 

在頭文件,並把

char str [ 20 ]; 

到只有cpp文件之一。