C ++ 11标准规定,§3.6.2,4:
“实现定义了具有静态存储持续时间的非局部变量的动态初始化是否在main的第一个语句之前完成。”
C ++标准区分静态初始化,它只需要评估编译时常量,而不是动态初始化。我相信热切静态初始化的可观察效果是有保证的。无论如何,我对热切的初始化感兴趣。
鉴于这种行为是实现定义并给定现有实现,是否有一种强大的可移植方式来强制进行初始化?这是由编译器或链接器做出的决定吗?我认为使用RTLD_NOW的dlopen()给出了这种行为,所以我怀疑这是可能的,并且它是一个链接器选项。
具体来说,我想动态链接库,并在main()之前运行全局变量的构造函数。
可以在此问题中找到可能用法的示例:
我们的想法是在main函数中访问一些类的全局注册表,并且动态链接库中的类可以通过初始化静态变量来添加自己。这个静态变量抓住了全球注册表的一部分,并为其增添了一些东西。这有时 ,但不可靠且不可预测,因为它取决于未定义的行为。