2014-02-27 193 views
3

根據我對C++ 2011規範的閱讀,我認爲下面的代碼會在file1.cc中創建一個帶有外部鏈接的變量'x'。我認爲我可以從main.cc訪問該變量,因此該程序將打印'x'。然而,我反而從main.cc中得到一個未定義的引用'x'的鏈接器錯誤。爲什麼file1.cc中的'x'有內部連接?我認爲編譯器正在將第3.5.3節解釋爲在file1.cc中給出'x'內部鏈接。然而,我並沒有「明確地聲明」'x'是'const',正如該部分所要求的那樣。我正在使用g ++版本4.6.3。爲什麼'x'有內部連接而不是外部連接?

main.cc:

#include <iostream> 

typedef const char CC; 

extern CC x[]; 

int main(void) { 
    std::cout << x[0] << std::endl; 
} 

file1.cc:

typedef const char CC; 

CC x[] = "abc"; 
+0

用gcc-4.8.2和鐺-3.3和'-std = C++ 11'兩我收到一個未定義的符號錯誤。原因在[這個問題]中給出(http://stackoverflow.com/questions/998425/why-does-const-imply-internal-linkage-in-c-when-it-doesnt-in-c) – vonbrand

回答

5

const使所有的差異。在C++ const在文件範圍聲明的變量隱含地具有內部鏈接。這是因爲在C++中,常量值可以用作編譯時常量(不會鏈接到任何內容)。

請參閱this answer

您可以添加extern您在file1.cc定義明確指定外部鏈接的x

extern CC x[] = "abc"; 
+1

' x'已被顯式聲明爲'extern'。 –

+3

@CaptainObvlious,只在'main.cc'中。 – vonbrand