C++11 仕様によると:
<iostream>
翻訳単位に含めた結果は、静的な保存期間<iostream>
を持つ のインスタンスが定義されているかのようになります。同様に、プログラム全体は、静的な保存期間ios_base::Init
を持つ のインスタンスが少なくとも 1 つあるかのように動作します。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 に含めました。仕様上はこれで十分でしょう。