我习惯于认为全局/静态类成员的所有初始化都发生在 main() 的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助模块的动态加载”。在动态链接时我可以看到这是真的:我不希望在 dlopen 库之前初始化库中初始化的全局变量。然而,在一组静态链接在一起的翻译单元(我的应用程序的直接 .o 文件)中,我会发现这种行为非常不直观。这仅在动态链接时才延迟发生还是可以随时发生? (或者我读到的内容是错误的?;)
该标准在3.6.2/3中有以下内容:
对象的动态初始化(8.5、9.4、12.1、12.6.1)是实现定义的
命名空间作用域在 main 的第一条语句之前完成。如果初始化被推迟到某个时间点
在 main 的第一个语句之后,它应在第一次使用定义的任何函数或对象之前发生
与要初始化的对象位于同一翻译单元中。
But o Of course you can never officially tell when the initialization takes place since the initialization will occur before you access the variable! as follows:
// t1.cc
#include <iostream>
int i1 = 0;
int main () {
std::cout << i1 << std::endl
// t2.cc
extern int i1;
int i2 = ++i1;
我可以确认 g++ 4.2.4 至少看起来在 main 之前执行了“i2”的初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)