假设我们有一个动态初始化的全局对象:
class A {
A() { std::cout << "constructorn"; }
};
A global_a; // Here it is
// Other translation unit
int main()
{
return 0;
}
c++ 14§3.6.2条款4具有静态存储时间的非局部变量的动态初始化是否在main的第一条语句之前完成,这是由实现定义的。如果初始化延迟到main语句第一个语句之后的某个时间点,则初始化应发生在与待初始化变量在同一翻译单元中定义的任何函数或变量第一次odr-use(3.2)之前
这意味着实现是不需要在main()之前初始化我们的对象,即使我知道的所有编译器都这样做。这是不幸的,因为有时有这样的保证是非常方便的,例如,对于驻留在单独文件中的独立自注册工厂,等等。
所以我想到了下面的方法:如果我们定义一些内联函数:
inline void f(){}
在每个翻译单元(假设使用一个共同的头)。然后在main()的开头,我们以某种方式使用它:
int main()
{
f();
//...
}
这能保证所有为f()提供定义的转换单元在此时初始化它们的全局对象吗?
技术上?是,根据您提供的报价和odr-use的定义。
在实践中,我不确定我是否会依赖它。我可以很好地想象编译器优化了f()
,并且有一些错误,然后破坏了你试图依赖的东西。虽然我没有数据支持这一点;根据经验,它似乎是不合规的主要候选者。
如果你真的,真的想确保程序启动时发生一些事情,总的来说,在main
的顶部调用global_a
上的一些"初始化"函数可能更好。我意识到这是一个反模式