2013-02-13 49 views
0

我的代碼是在這裏:EXTERN在C++(VS2012)多個定義的符號發現

Header.h文件:

#ifndef HEADER_H_ 
#define HEADER_H_ 

extern int k; 

#endif /* HEADER_H_ */ 

Source1.h文件:

#include <iostream> 
#include "Header.h" 
using namespace std; 

#ifndef SOURCE1_H_ 
#define SOURCE1_H_ 

int k = 10; 

void punch(){ 
    cout << k << endl; 
} 

#endif /*SOURCE1_H_*/ 

Source.cpp文件:

#include "Source1.h" 
using namespace std; 

int main() 
{ 
punch(); 
cin.get(); 
return 0; 
}; 

我在Visual Studio 2012上編譯在Windows 7中的快遞版。錯誤代碼是:

1>c:\users\freeman\documents\visual studio 2012\Projects\exploringexterns\Debug\exploringexterns.exe : fatal error LNK1169: one or more multiply defined symbols found 

我在做什麼錯?

+0

鏈接器說什麼符號被多次定義?另外,請不要在標題中使用'namespace std'。搜索爲什麼這是一件壞事。 – Praetorian 2013-02-13 15:51:08

+0

似乎是int k – 2013-02-13 15:57:36

+0

@Praetorian沒有命名空間std會導致錯誤,你的意思是將它包含在cpp文件中,並在頭文件中聲明函數/在源文件中實現? – 2013-02-13 18:08:33

回答

2

您需要將定義移動到一個且只有一個源文件。

int k = 10; 

通過定義在頭文件中的變量,你違反了,因爲變量的副本,每個翻譯單元被定義,你包括頭中的一個定義規則。

+1

這是最有可能的原因,但從發佈的代碼,似乎只有一個TU(* Source.cpp *) – Praetorian 2013-02-13 15:51:57

+0

發佈的代碼顯示'int k = 10'在'source1.h'文件中。 ''k'的聲明需要被移動到'source1.cpp'文件中,並且它在'source1.h'中的位置應該是'extern k'的行;' – StarPilot 2013-02-13 15:58:51

+0

@StarPilot:聲明和定義之間有區別,你似乎混淆了兩者。 – 2013-02-13 16:03:19

0

我完全按照您的要求構建了該代碼,沒有任何錯誤......那裏有更多嗎?因爲則k會被多次定義

在Source1.h

int k = 10;

潛在的,如果你有一個包括「Source1.h」另一個源文件,你就必須與這條線有問題。我會將int k=10移動到Source.cpp

+0

它也說錯誤LNK2005:「int k」(?k @@ 3HA)已經在Source.obj中定義了\t c:\ Users \ Freeman \ documents \ visual studio 2012 \ Projects \ exploringexterns \ exploringexterns \ Source1。obj \t exploringexterns – 2013-02-13 16:02:22

+0

如果唯一的定義是在Source1.h中int k = 10,它將如何多次定義? – 2013-02-13 16:06:22

+0

如果「Source1.h」僅包含在項目中的一個cpp文件中(這是您的源代碼說的),那麼它將編譯find。問題是,如果項目中有另一個源文件(cpp)包含「Source1.h」,那麼您將遇到問題。因此,在頭文件中定義變量是一個好主意,最好在cpp文件中定義它們。 – 2013-02-13 16:08:49