2014-02-27 112 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