28

例如:

代码1.c / .cpp

int a;

// ... and so on

代码2.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++ 之间是否有任何全局变量链接差异?

4

4 回答 4

21

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

这是一种常用的扩展,允许跨多个 C 翻译单元的暂定定义,只要不超过一个翻译单元包含非暂定定义,但它不是严格标准。

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

对于 C 的情况,你不妨看看这个问题

于 2011-06-16T11:35:59.743 回答
4

两者都是非法的,但 C 编译器通常会实现扩展。看到这个答案

于 2011-06-16T11:35:13.137 回答
2

解决问题的方法有以下三种:

  1. 如果两个文件中的变量a相同,则必须extern在除一个文件之外的所有文件中声明它。extern关键字告诉链接器该名称位于另一个文件中。

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

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

于 2011-06-16T11:38:14.190 回答
1

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

用于extern避免

于 2011-06-16T11:40:47.753 回答