c++ - 在不同的翻译单元中启动全局变量(涉及链接器)
问题描述
我最近正在审查 C++。这是我的问题。file1.cpp
请参阅和中的代码file2.cpp
。
文件1.cpp
int x1 = 1;
int y1 = x1 + 2;
文件2.cpp
#include "necessary_headers"
extern int y1;
int y2 = y1 + 2;
int main()
{
cout << "y2 is "<<y2<<endl;
return 0;
}
我以不同的顺序编译:
gcc file1.cpp file2.cpp
输出y2 is 5
当然是 。
gcc file2.cpp file1.cpp
输出是y2 is 2
。(我的问题是关于这个)
我也试试这个:gcc file2.cpp
。当然,这给出undefined reference to y1
了 。
我的问题是,即使链接序列“错误” ,为什么还要gcc file2.cpp file1.cpp
编译而不是给出错误?undefined reference to y1
是因为在链接时file2.cpp
,链接器很聪明地引用y1
了以下文件中定义的内容file1.cpp
吗?并且以这种方式,y1
被初始化为 0(默认值)file2.cpp
而不是使用file1.cpp
? 那么这样一来,file1.cpp
"int y1 = x1 + 2"
链接序列中的定义和初始化不就失效了吗?如果没有,我该如何执行该语句来分配y1 = x1 + 2
?最后,这是一般的编译器行为吗?根据 c++ 标准,在不同的翻译单元中初始化全局变量的顺序是未定义的。
谢谢你的帮助!真的很感激。
解决方案
我的问题是,即使链接序列“错误”,为什么 gcc file2.cpp file1.cpp 会编译而不是给出对 y1 错误的未定义引用?
当一个名称具有外部链接时,它所表示的实体可以被其他翻译单元的范围或同一翻译单元的其他范围的名称引用。
因此,extern int y1;
如果您编译包含y1
.
在链接过程中,y1
会从其他翻译单元中检查 的定义。
推荐阅读
- reactjs - `onBlur` 未在 'Jodit` wyswig 编辑器代码编辑器模式下触发,`useCallback` 无法正常工作
- azure - 在 Azure VM 上为 HTTPS 配置 SSRS
- python - 在 Matplotlib 中向折线图添加数据标签
- reactjs - 如何在我的 React 应用程序中向 Monaco Editor 添加使用 Antlr4 语法文件功能的自动完成、语法突出显示?
- node.js - 为什么我不能在端口 5000 上运行项目?
- python-3.x - Flask 应用程序不会部署在 ElasticBeanstalk 上
- java - 为什么代码将语句打印两次,但不同?
- c++ - 在指向同一对象的源链接中具有相同类名的依赖注入?
- blazor-webassembly - Blazor wasm 无法启动平台。原因:TypeError: NetworkError 尝试获取资源时
- unit-testing - Gmock - 检查方法是否未使用特定参数调用