2011-12-01 63 views
1

假設我創建的頭文件和constants.h此文件包含:具有恆定變量定義鏈接在頭文件

extern const int YEAR = 2011; // definition 

如果我在CPP文件(MainCPP.cpp)試圖使用這個恆定後宣佈它沒有定義它,而不包括constants.h文件如下:

extern const int YEAR; // declaration 

int main() { 
    cout << YEAR << endl; 
} 

當我嘗試這樣做,我得到:解析外部符號「INT常量YEAR」。另一方面,如果我將YEAR的定義放在constant.cpp文件中,並且在MainCpp.cpp中完成了相同的操作,我將不會收到錯誤,並且鏈接程序將能夠與constants.cpp中定義的YEAR鏈接(不包括MainCpp.cpp中的constants.cpp也在這裏)。

這是否意味着鏈接器可以鏈接源文件代碼,但不能與頭文件代碼鏈接,除非您明確包含頭文件。

+0

感謝[羅布K](http://stackoverflow.com/users/53089/rob-k)..我試圖包括constants.h在另一個cpp文件(而不是MainCpp.cpp),現在鏈接器能鏈接MainCpp.cpp文件中使用的YEAR。這證明編譯器不會編譯.h文件。它包含在.cpp文件中,其中#included通過用.h文件的內容替換#include <...>,並且沒有爲.h文件本身生成目標代碼。 – nizar

回答

0

extern告訴編譯器在其他地方爲其分配空間。必須在沒有外部信息的情況下對其進行定義。但在C++中(與C不同),const有內部鏈接,所以你不需要extern。 (請參閱Why does const imply internal linkage in C++, when it doesn't in C?

只需將const int YEAR = 2011;放在頭文件中,並將頭文件包含在您需要的任何地方。

+0

我知道我可以在頭文件中定義YEAR幷包含它,但是我的問題是爲什麼如果我沒有包含它,編譯器不能與頭文件中的定義鏈接? – nizar

+0

另一方面,如果我在cpp文件(constants.cpp)中聲明並定義YEAR,並在main.cpp中使用YEAR而不包含constants.cpp,則鏈接器將能夠與YEAR鏈接。 – nizar

+0

編譯器不編譯.h文件。編譯器將它包含到.cpp文件中,其中#included通過將.h文件的內容替換爲#include <...>。 .h文件本身沒有生成目標代碼。 現在,如果您在.h文件中定義中省略了extern,則C++編譯器可以直接在代碼中使用const的字面值,並且可能不需要爲其分配任何內存位置。 –

3

頭文件中的聲明應該是聲明,而不是定義。換句話說,不要將「= 2011」放在標題中。

這個變量需要在某個地方定義,比如你的main.cpp。不要將extern置於該定義中。

最後,如果您想在運行時爲變量賦值,則不能用const限定符聲明它。

+0

我想在我的頭文件constants.h中放置我將在我的應用程序中使用的常量。聲明和定義應該在頭文件中。我的問題是爲什麼如果我沒有包含頭文件並且使用YEAR,那麼鏈接器無法找到它,而如果我將YEAR的聲明和定義放在另一個cpp文件中並且沒有包含它,鏈接器將能夠找到YEAR? – nizar