在不同的翻译单元中启动全局变量(涉及链接器)

时间:2018-04-25 03:50:02

标签: c++ linker initialization global-variables

我最近在回顾C ++。这是我的问题。请参阅file1.cppfile2.cpp中的代码。

file1.cpp

int x1 = 1;
int y1 = x1 + 2;

file2.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错误,即使链接序列是&#34;错误&#34;?是因为在链接file2.cpp时,链接器是否智能引用y1,该file1.cpp在以下文件y1中定义?这样,file2.cpp中的file1.cpp初始化为0(默认值),而不是使用file1.cpp中的定义?那么这样,"int y1 = x1 + 2" y1 = x1 + 2中的定义和初始化是否由链接序列无效?如果没有,我该如何执行该语句来分配[]?最后,这是一般的编译器行为吗?根据c ++标准,未定义在不同翻译单元中初始化全局变量的顺序。

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

1 个答案:

答案 0 :(得分:1)

  

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

来自basic.link#2.1

  

当名称具有外部链接时,它表示的实体可以是   来自其他翻译单位范围的名称或来自   同一翻译单位的其他范围。

因此,如果编译包含extern int y1;定义的文件(例如file1.cpp),则y1未定义。

对于链接期间,从其他翻译单元检查y1的定义。