C和C ++默认全局变量链接,多重声明和定义问题
-
28-10-2019 - |
题
例如:
code1.c / .cpp 通用标签
code2.c / .cpp 通用标签
开始编译: 通用标签
C和C ++之间是否存在全局变量链接差异?
解决方案
这不是严格的法律。int a;
是C中的一个暂定定义。在C中,每个具有外部链接的对象的每个翻译单元都可以有多个暂定定义和一个非暂定定义,但是程序中所有翻译单元只能包含一个定义。
这是一种通用实现的扩展,允许在C中跨多个翻译单元进行暂定定义,只要不超过一个翻译单元包含一个非暂定定义,但它不是严格的标准。
在C ++中,int a;
只是一个定义-没有暂定的概念-并且在程序的翻译单元中对一个对象进行多个定义仍然是非法的。
对于C情况,您可能希望查看这个问题。
其他提示
在这两者中都是非法的,但是C编译器通常实现扩展。参见此答案。
有三种解决问题的方法:
-
如果两个文件中的变量
a
都相同,则必须在除一个文件之外的所有文件中将其声明为extern
。extern
关键字告诉链接器此名称位于另一个文件中。 -
您可以使用
static
关键字将变量的范围限制为一个文件。在其中声明。 -
或者您可以使用无名命名空间。
g ++编译器比gcc编译器更严格。 它还取决于gcc的版本,可能是gcc的更高版本,即从4.X开始,它可能会给出相同的错误。
使用extern
来避免
不隶属于 StackOverflow