1

考虑以下 C++11 程序:

翻译单元#1:

int x = 3;

int main() {}

翻译单元#2:

int x = 4;

这个程序格式不正确吗?为什么/为什么不?

gcc 抱怨说:

error: multiple definition of `x'

我能看到的唯一相关规则是在 3.2.4 中:

每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义

但是x程序中没有使用 odr。(或者是吗?)

这是一个 gcc 错误吗?还是我在标准中遗漏了什么?

4

2 回答 2

1

这不是 gcc 错误,而是标准行为。

实际上,int x;定义了一个符号,如果定义两次或更多,则会导致链接器错误。

C++ 标准3.5 (9)

两个相同的名称(第 3 条)并且在不同的范围内声明应表示相同的变量、函数、类型、枚举器、模板或命名空间,如果

— 两个名称都有外部链接,否则两个名称都有内部链接并在同一个翻译单元中声明;和

— 两个名称都指同一命名空间的成员或同一类的成员,而不是继承;和

— 当两个名称都表示函数时,函数的参数类型列表(8.3.5)是相同的;和

— 当两个名称都表示函数模板时,签名 (14.5.6.1) 相同。

于 2013-08-31T11:32:41.720 回答
1

我知道您正在寻找基于标准的解释,但在这种情况下,我认为没有必要。

全局变量和函数声明,除非声明,否则static具有外部链接。

带有初始化的声明算作定义。您x在两个地方声明了同一个变量,并用 2 个不同的值对其进行了初始化。(事实上​​,它甚至可以是相同的值。)

这意味着,您有 2 个相同变量的定义。这是肯定的。

意思是,您上面的示例违反了 ODR。

我记得即使在 C 的史前时代也是如此。

在 C++ 中,static我们可以将所有全局定义放在 中,而不是使用anonymous namespace,效果是一样的。

于 2013-08-31T11:50:32.320 回答