c++ - 为什么不同 block 中相同命名的外部局部变量在 C++ 中的编译器之间获得不同的链接?

标签 c++ g++ clang++ extern linkage

虽然我只是在检查哪些链接被授予外部局部变量
我发现编译器之间的一些不同行为
例如,如果我测试了下面的代码
正如您在评论变量 var 中看到的那样s 有不同的联系

// 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++:“100 10 10”
  • 铛++,msvc++:“100 100 100”

  • 从结果可以看出,如果有两个以上的嵌套块
    g++ 只是授予变量的外部链接
    我可以在标准中找到相关短语
    但目前还不清楚,因为编译器的行为不同
    ( https://eel.is/c++draft/basic.link#6 )
    我怕我的英语不好所以我听不懂
    如果有人知道哪些编译器符合标准
    如果可能的话,有人可以详细说明标准对我说的确切内容吗?

    最佳答案

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

    关于c++ - 为什么不同 block 中相同命名的外部局部变量在 C++ 中的编译器之间获得不同的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61276220/

    相关文章:

    c++ - 编译 typeid(obj) 时会发生什么 - C++

    c++ - 操纵器,C++ 我应该按什么顺序使用它们?

    c++ - 1.5后 float 显示0号

    c++ - 检测基类分配给指向派生类的引用

    c++ - 类型转换对的 g++ 警告选项?

    visual-c++ -/show在g++中包含等效选项

    objective-c++ - 在 std::function 中存储 Objective-c block 是否安全?

    c++ - 使用命名空间别名编译 opencv

    c++ - 从嵌套在模板中的类派生时的编译问题

    c++ - clang 的 c++11 支持可靠吗?