为什么不同块中相同命名的外部局部变量在 C++ 中的编译器之间获得不同的链接?
Why same named extern local variables in different blocks get different linkages between compilers in c++?
虽然我只是在检查哪些链接被授予外部局部变量
我发现编译器之间有一些不同的行为
例如,如果我测试了下面的代码
正如您在评论中看到的变量 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”
- clang++,msvc++:“100 100 100”
从结果可以看出,如果有两个以上的嵌套块
g++ 只授予变量的外部链接
我可以在标准中找到相关短语
但仍然不清楚,因为它的行为因编译器而异
(https://eel.is/c++draft/basic.link#6)
我怕我的英文不好所以没能正确理解
如果有人知道哪些编译器很好地符合标准
如果可能的话,有人可以详细说明标准对我来说究竟是什么吗?
这是未决问题 CWG1839 的主题。目前的意图是Clang和MSVC的行为是正确的。
虽然我只是在检查哪些链接被授予外部局部变量
我发现编译器之间有一些不同的行为
例如,如果我测试了下面的代码
正如您在评论中看到的变量 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”
- clang++,msvc++:“100 100 100”
从结果可以看出,如果有两个以上的嵌套块
g++ 只授予变量的外部链接
我可以在标准中找到相关短语
但仍然不清楚,因为它的行为因编译器而异
(https://eel.is/c++draft/basic.link#6)
我怕我的英文不好所以没能正确理解
如果有人知道哪些编译器很好地符合标准
如果可能的话,有人可以详细说明标准对我来说究竟是什么吗?
这是未决问题 CWG1839 的主题。目前的意图是Clang和MSVC的行为是正确的。