我最近在回顾C ++。这是我的问题。请参阅file1.cpp
和file2.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 ++标准,未定义在不同翻译单元中初始化全局变量的顺序。
感谢您的帮助!真的很感激。
答案 0 :(得分:1)
我的问题是,为什么gcc file2.cpp file1.cpp会编译而不是 即使链接序列是,也给y1错误提供未定义的引用 “错”?
当名称具有外部链接时,它表示的实体可以是 来自其他翻译单位范围的名称或来自 同一翻译单位的其他范围。
因此,如果编译包含extern int y1;
定义的文件(例如file1.cpp),则y1
未定义。
对于链接期间,从其他翻译单元检查y1
的定义。