extern "C" 变量受编译器优化级别影响

Zos*_*oso 8 c++ gcc

考虑这个带有片段的链接

#include <cstdio>

namespace X {
    extern "C" int z;
}

namespace Y {
    extern "C" int z;
}

int X::z = 1;
int main()
{
    std::printf("%d -- %d\n", X::z, Y::z);
    X::z = 2;
    Y::z = 4;
    std::printf("%d -- %d\n", X::z, Y::z);
    X::z = 0;
    std::printf("%d -- %d\n", X::z, Y::z);
}
Run Code Online (Sandbox Code Playgroud)

-O1GCC 输出

1 -- 1
2 -- 4
0 -- 0
Run Code Online (Sandbox Code Playgroud)

而未启用优化的 GCC 的输出与 CLANG 的输出匹配(在所有优化级别),即

1 -- 1
4 -- 4
0 -- 0
Run Code Online (Sandbox Code Playgroud)

这是 GCC 中的编译器错误吗?因为extern "C"我希望禁用名称修改,因此z两个命名空间中只有变量,因此值应该始终相同。

use*_*522 13

这是一个 GCC 错误。这里已经报告了类似的测试用例。(尽管这个可能比您的测试用例更微妙,因为它还取决于using namespace查找的准确工作方式)。

正如您所期望的,标准规定具有 C 链接的变量声明和在不同命名空间范围中声明的相同名称引用相同的实体,请参阅[dcl.link]/7