最近在复习C++。这是我的问题。请参阅中的代码file1.cpp
and 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 错误的未定义引用
“错误的”?
From 基本.link#2.1 https://timsong-cpp.github.io/cppwp/basic.link#2.1
当一个名字有external链接,它表示的实体可
其他翻译单元范围内的名称引用或来自
同一翻译单元的其他范围。
Thus, extern int y1;
如果您编译包含以下定义的文件(例如 file1.cpp),则不是未定义的y1
.
对于链接期间,定义y1
从其他翻译单位检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)