![](/img/trans.png)
[英]C++: Declaration of variable in global scope conflicts with declaration with C language linkage
[英]c & c++ default global variable linkage, multiple declaration & definition problem
例如:
code1.c / .cpp
int a;
// ... and so on
code2.c / .cpp
int a;
int main(void) {
return 0;
}
去编译:
$gcc code1.c code2.c # this is fine
$
$g++ code1.cpp code2.cpp # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
C&C ++之间是否存在全局变量链接差异?
这不是严格合法的。 int a;
是C中的暂定定义。允许多个暂定定义,每个对象的每个翻译单元最多有一个非暂定定义,在C中有外部链接,但程序中所有翻译单元只有一个定义。
它是一种通常实现的扩展,允许在C中的多个翻译单元进行临时定义,只要不超过一个翻译单元包含非暂定定义,但它不是严格标准的。
在C ++中int a;
只是一个定义 - 没有暂定的概念 - 在程序的翻译单元中有一个对象的多个定义仍然是非法的。
对于C案例,您可能希望看一下这个问题 。
这两者都是非法的,但C编译器通常会实现扩展。 看到这个答案 。
解决问题有三种方法:
如果两个文件中的变量a
相同,则必须在除一个文件之外的所有文件中将其声明为extern
。 extern
关键字向链接器说这个名称位于另一个文件中。
您可以使用static
关键字将变量范围限制为一个文件。 在其中声明。
或者您可以使用无名空间。
g ++编译器比gcc编译器更严格。 它还取决于gcc的版本,可能是更高版本的gcc,即4.X以后它可以给出相同的错误。
使用extern
来避免
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.