首页 > 解决方案 > 在不同的翻译单元中启动全局变量(涉及链接器)

问题描述

我最近正在审查 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++ 标准,在不同的翻译单元中初始化全局变量的顺序是未定义的。

谢谢你的帮助!真的很感激。

标签: c++linkerinitializationglobal-variables

解决方案


我的问题是,即使链接序列“错误”,为什么 gcc file2.cpp file1.cpp 会编译而不是给出对 y1 错误的未定义引用?

来自basic.link#2.1

当一个名称具有外部链接时,它所表示的实体可以被其他翻译单元的范围或同一翻译单元的其他范围的名称引用。

因此,extern int y1;如果您编译包含y1.

在链接过程中,y1会从其他翻译单元中检查 的定义。


推荐阅读