Jos*_*vin 9 c++ static initialization global-variables dynamic-linking
我习惯于考虑在main()的第一行之前发生的globals/static-class-members的所有初始化.但我最近在某处读到,标准允许稍后进行初始化以"协助动态加载模块".在动态链接时我可以看到这是真的:在我开始使用库之前,我不希望在库中初始化全局初始化.但是,在一组静态链接在一起的翻译单元(我的应用程序的直接.o文件)中,我会发现这种行为非常不直观.这只是在动态链接时懒得发生,还是随时都可以发生?(或者我读错了?;)
该标准在3.6.2/3中有以下内容:
它是实现定义的,无论命名空间作用域的对象的动态初始化(8.5,9.4,12.1,12.6.1)是否在main的第一个语句之前完成.如果初始化延迟到main的第一个语句之后的某个时间点,则它应该在第一次使用与要初始化的对象相同的转换单元中定义的任何函数或对象之前发生.
但是o当然,您无法正式判断何时进行初始化,因为在您访问变量之前将进行初始化!如下:
// t1.cc
#include <iostream>
int i1 = 0;
int main () {
std::cout << i1 << std::endl
// t2.cc
extern int i1;
int i2 = ++i1;
Run Code Online (Sandbox Code Playgroud)
我可以遵循g ++ 4.2.4至少似乎在main之前执行'i2'的初始化.