首页 > 解决方案 > 为什么不同块中相同命名的外部局部变量在c ++中的编译器之间获得不同的链接?

问题描述

当我只是检查哪些链接被授予外部局部变量时
,我发现编译器之间存在一些不同的行为

例如,如果我测试了下面的代码
,正如您在评论中看到的那样,变量vars 有不同的链接

// foo.cpp
int var = 10;                // external linkage

// main.cpp
#include <iostream>

static int var = 100;        // internal linkage

int main() {
    extern int var;          // internal linkage
    std::cout << var << std::endl;
    {
        extern int var;      // g++: external linkage , clang++: internal linkage
        std::cout << var << std::endl;
        {
            extern int var;  // g++: external linkage , clang++: internal linkage
            std::cout << var << std::endl;
        }
    }
}       

结果是

我可以从结果中看到,如果有两个以上的嵌套块
g++ 只是授予变量的外部链接

我可以在标准中找到相关的短语,
但仍不清楚,因为编译器的行为不同
https://eel.is/c++draft/basic.link#6

恐怕我的英语不好,所以我无法正确
理解如果有人知道哪些编译器符合标准
,如果可能的话,有人可以详细说明标准对我的确切含义吗?

标签: c++g++clang++externlinkage

解决方案


这是公开问题CWG1839的主题。当前意图是 Clang 和 MSVC 的行为是正确的。


推荐阅读