为什么同样命名的外部局部变量在不同的块中会在不同的编译器之间获得不同的链接?

问题描述 投票:5回答:1

当我检查外部局部变量的链接时,我发现在不同的编译器之间有一些不同的行为。

例如,如果我测试了下面的代码,就像你在注释中所看到的那样,变量为 var有不同的联系

// 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"
  • clang++ : "100 100 100" (msvc++)

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

我可以在标准中找到相关的短语,但它仍然不清楚,因为它的行为因编译器而异 (https:/eel.isc++draftbasic.link#6)

我怕我的英语不好,所以我不能正确地理解它,如果有人知道哪些编译器是符合标准的,如果可能的话,有人能为我详细说明标准的具体内容吗?

c++ g++ clang++ extern linkage
1个回答
4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.