我有一个程序链接两个不同的TU如下:
的main.cpp
int a = 6;
struct A
{
int b = a;
};
int main(){ }
slave.cpp
static int a = 42;
struct A
{
int b = a;
};
我希望链接器在这种情况下会抛出错误,因为N3797::3.2/6
[basic.def.odr]):
类类型[...]
可以有多个定义鉴于这样一个名为D的实体在多个翻译中定义 单位,然后
[...]
- 在D的每个定义中,相应的名称, 根据3.4查找,应指在其中定义的实体 D的定义,或在超载后应指同一实体 分辨率(13.3)和部分模板匹配后 专业化(14.8.3),但名称可以引用a 非易失性const对象,如果是对象,则内部或无链接 在D的所有定义中具有相同的文字类型,对象是 用常量表达式(5.19)初始化,而对象不是 odr-used,并且对象在D的所有定义中具有相同的值;
[...]
所以在我的情况下a
指的是不同TU中的不同实体,因此它不应该正确链接。但就我而言,确实如此。我正在gcc -o bin main.o slave.o
使用gcc 4.7.2-2ubuntu1
。这是一个错误吗?