类似于这个问题,但现在我有两个翻译单元:
// a.cpp
#include <iostream>
void print_hello() {
std::cout << "hello\n";
}
// b.cpp
void print_hello();
struct StaticObject {
StaticObject() {
print_hello();
}
} static_object;
int main() {
}
如果我在本地使用 编译这两个g++ -std=c++17 a.cpp b.cpp
,则会导致a.exe
崩溃。我的编译器版本g++ (Rev2, Built by MSYS2 project) 10.3.0
在 Windows 上。我也可以通过编译来重现这种g++ -std=c++17 b.cpp a.cpp
行为g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
我相信这是因为b.cpp
不包括在任何<iostream>
东西static_object
之前被构造,特别是a.cpp
对应std::ios_base::Init
的提供<iostream>
。因此,当print_hello()
被调用时,std::cout
尚未初始化,因此崩溃。
最后一个问题是:C++17 是否保证std::cout
在所有具有静态存储持续时间的“用户提供”(因为缺少更好的词)对象被初始化之前初始化?实验表明并非如此。