假设我们有一些全局对象需要进行动态初始化:
class A {
A() { std::cout << "constructor\n"; }
};
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()提供定义的所有翻译单元都会在此时初始化其全局对象?
答案 0 :(得分:1)
技术上? 是,根据您提供的报价和 odr-use 的定义。
在实践中,我不确定我会依赖它。我可以想象编译器会优化f()
并有一些错误然后会破坏你想要依赖的东西。虽然我没有数据支持这个;根据经验,它似乎只是不合规的主要候选人。
如果你真的想要确保在程序启动时发生某些事情,总的来说,最好在global_a
顶部的main
上调用一些“初始化”功能。我意识到这是一种反模式。