C++ C++;main()之前的静态存储持续时间对象初始化

C++ C++;main()之前的静态存储持续时间对象初始化,c++,static,initialization,global,main,C++,Static,Initialization,Global,Main,假设我们有一些全局对象进行动态初始化: class A { A() { std::cout << "constructor\n"; } }; A global_a; // Here it is // Other translation unit int main() { return 0; } 在每个翻译单元中(假定使用公共标题)。 然后在main()中,我们以某种方式使用它: int main() { f(); //... } 这是否可以保证所

假设我们有一些全局对象进行动态初始化:

class A {
    A() { std::cout << "constructor\n"; }
};
A global_a; // Here it is

// Other translation unit
int main()
{
    return 0;
}
在每个翻译单元中(假定使用公共标题)。 然后在main()中,我们以某种方式使用它:

int main()
{
    f();
    //...
}

这是否可以保证所有为f()提供定义的转换单元都将在此时初始化其全局对象?

技术上,根据您提供的报价和odr使用的定义

实际上,我不确定我是否会依赖它。我可以很好地想象编译器在优化
f()
的过程中出现了一些bug,这些bug会破坏您试图依赖的东西。虽然我没有数据支持这一点;从经验来看,这似乎是不合规的主要原因


如果您真的想确保程序启动时发生一些事情,总的来说,最好在
main
顶部的
global\u a
上调用一些“初始化”函数。我意识到这是一种反模式。

不会
(无效)(&f)一旦打开优化,就会被优化掉吗?这可能会,尽管在这里它并不重要。优化是一种转移视线的行为:编译器在优化时不允许更改程序的行为。@tobi303触发初始化是ODR使用
f
的一个明显的、定义良好的副作用,即使
f
本身什么也不做。删除该副作用将违反“似乎”规则。@tobi303可能是我遗漏了什么,但引用的段落清楚地指出,无论何时发生初始化(这是实现定义的),都应该在首次使用ODR时使用
f
(这是定义明确的)。唯一可能的跨度是
main
的大括号和
&f
之间,在这里它被缩减为零,所以在我看来这必须按预期工作。好吧,因为我知道的所有编译器都已经在main()之前初始化了全局对象,所以我不必担心任何事情。这个问题理论性强,实际性差。我很高兴知道,我的代码可以保证在完全兼容的环境下正常工作compiler@dsi:是否使用完全兼容的编译器?是的,绝对是。但我从未见过完全兼容的编译器。
int main()
{
    f();
    //...
}