c& c ++默认全局变量链接,多重声明&定义问题

时间:2011-06-16 11:27:07

标签: c++ c linkage multiple-definition-error one-definition-rule

例如:

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之间是否存在全局变量链接差异? C ++?

4 个答案:

答案 0 :(得分:19)

这不是严格合法的。 int a;是C中的暂定定义。允许多个暂定定义,每个对象的每个翻译单元最多一个非暂定定义,在C中具有外部链接,但在程序中的所有翻译单元中只有一个定义。

这是一个通常实现的扩展,允许在C中的多个翻译单元中进行临时定义,只要不超过一个翻译单元包含非暂定定义,但它不是严格标准的。

在C ++中int a;只是一个定义 - 没有暂定的概念 - 在程序的翻译单元中有一个对象的多个定义仍然是非法的。

对于C案例,您可能希望查看this question

答案 1 :(得分:4)

这两者都是非法的,但C编译器通常实现扩展。请参阅this answer

答案 2 :(得分:2)

解决问题的方法有三种:

  1. 如果两个文件中的变量a相同,则必须在除一个文件以外的所有文件中将其声明为externextern关键字向链接器表示此名称位于其他文件中。

  2. 您可以使用static关键字将变量范围限制为一个文件。声明它。

  3. 或者您可以使用无名命名空间。

答案 3 :(得分:1)

g ++编译器比gcc编译器更严格。 它还取决于gcc的版本,可能是更高版本的gcc,即4.X以后它可以给出相同的错误。

使用extern来避免