根据 C++11 规范:
包含
<iostream>
在翻译单元中的结果应如同<iostream>
定义ios_base::Init
具有静态存储持续时间的实例一样。同样,整个程序的行为就好像至少有一个ios_base::Init
具有静态存储持续时间的实例
这意味着如果我的代码看起来像这样:
// A.cpp
#include <iostream>
using namespace std;
unsigned long foo() {
cerr << "bar";
return 42;
}
和
// B.cpp
using namespace std;
extern unsigned long foo();
namespace {
unsigned long test() {
int id = foo();
return id;
}
unsigned long id = test();
}
int main() {
return 0;
}
那么我应该可以安全地调用cerr
,而不会有静态初始化失败的风险。
不幸的是,该代码段错误......为什么?我不认为 gcc 6.2.1 决定忽略 C++11 规范,我将其包含<iostream>
在 A.cpp 中。根据规范应该足够了。