c++ - 为什么不同块中相同命名的外部局部变量在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”
- 铿锵++,msvc++:“100 100 100”
我可以从结果中看到,如果有两个以上的嵌套块
g++ 只是授予变量的外部链接
我可以在标准中找到相关的短语,
但仍不清楚,因为编译器的行为不同
(https://eel.is/c++draft/basic.link#6)
恐怕我的英语不好,所以我无法正确
理解如果有人知道哪些编译器符合标准
,如果可能的话,有人可以详细说明标准对我的确切含义吗?
解决方案
这是公开问题CWG1839的主题。当前意图是 Clang 和 MSVC 的行为是正确的。
推荐阅读
- c# - 使用 Prig 模拟 MessageBox
- docker - 如何运行 hyperedger/composer-cli docker image 来执行 composer 命令?
- python - 正则表达式 - 检查字符串中以“Something”开头的单词
- embedded - 为什么不能使用内核服务从 NMI 处理程序内部发出任务信号?
- c# - 调用操作方法时出现 HTTP 404 not found 错误
- mongodb - MongoDB 中跨副本集的读取分布
- vuforia - Vuforia - 从相机设备裁剪 Image/Texture2D
- javascript - 将时间转换为时刻时区中的特定时区
- angularjs - 调用函数时AngularJS无限循环调用?
- java - 回收站视图中的重复项目,notifydatasetchanged 不起作用