hen*_*yao 6 c++ linker compilation external
fileA.cpp:
#include <iostream>
extern int iA;
extern int iB= iA;
int main()
{
std::cout<<iA<<','<<iB;
}
Run Code Online (Sandbox Code Playgroud)
fileB.cpp
extern int iB;
extern int iA = 2*iB;
Run Code Online (Sandbox Code Playgroud)
编译和链接并运行,进入调试和发布模式是0,0
我的问题是它是如何工作的,为什么链接阶段没有问题?我正在使用VC++ 2003.
初始化程序会覆盖extern关键字,因此这没有什么“神奇”之处:您只是在不同的翻译单元中声明和定义两个完全不相关的变量。
\n\n声明是一个定义,除非它在声明函数时未指定函数\xe2\x80\x99s 主体 (8.4),它包含
\nextern说明符(7.1.1) 或链接规范25 (7.5) ,并且既不包含初始化程序也不包含函数-body,它在类定义中声明静态数据成员 (9.2, 9.4),它是类名声明 (9.1),它是不透明枚举声明(7.2),它是模板参数(14.1) ,它是函数声明器中的参数声明(8.3.5),而不是函数定义的声明器,或者它是typedef声明(7.1.3)、别名声明(7.1.3)、using -声明(7.3.3)、static_assert 声明(第 7 条)、属性声明(第 7 条)、空声明(第 7 条) 或using 指令(7.3.4)。
因此,您的程序相当于以下内容:
\n文件A.cpp
\n#include <iostream>\nextern int iA;\nint iB= iA;\nint main()\n{\nstd::cout<<iA<<\',\'<<iB;\n}\nRun Code Online (Sandbox Code Playgroud)\n文件B.cpp
\nextern int iB;\nint iA = 2*iB;\nRun Code Online (Sandbox Code Playgroud)\n在发生任何其他事情之前,这两个对象都必须经历静态初始化(按位全零)。当稍后进行动态初始化时,根据 fileA.cpp 或 fileB.cpp 中的 static-storage-duration 对象是否首先被初始化(并且您不知道它的顺序),或者iB被初始化为零iA(然后按预期iA初始化为 0 ),或者初始化为 0乘以 2,仍然为零(然后初始化为 0 )。2*iBiAiBiBiA
无论哪种方式,通过明确定义的语义,这两个对象最终都将具有零值。
\n| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |