0

类似于这个问题,但现在我有两个翻译单元:

// 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在所有具有静态存储持续时间的“用户提供”(因为缺少更好的词)对象被初始化之前初始化?实验表明并非如此。

4

0 回答 0