我有一个头文件,它定义了两个对象:
// header.h
static A object1("param1", "param2");
static A object2("param1", "param2");
这就是A的样子:
class A {
public:
int random;
A(char* p1, char* p2){
printf("Called constructor for %s | %s\n", p1, p2);
}
};
但是,构造函数永远不会被调用。我这样做:
#include "header.h"
int main(){
// to prevent optimization issues
object1.random = rand();
if (object1.random != 3) { printf("\n"); }
return 0;
}
我从未在控制台上看到消息,它仍然是空的。
我已经阅读了static initialization order fiasco
,但我认为这不是问题,因为这些对象都不依赖于另一个,所以订单并不是真的物质...
我在Windows 7 x64上使用MSVC ++ 2013
答案 0 :(得分:0)
When are static C++ class members initialized?包含有关此主题的绝佳答案。
简而言之,有3个保证(引用上述问题中的原始Tadeusz Kopec答案):
如果在特定情况下静态变量object1
和object2
未初始化,则可能与编译器优化无关,省略了未使用变量的初始化。您可以通过在main中添加这些变量的用法来轻松验证这一点,并观察这些变量是否已初始化以及何时初始化。