В соответствии с С ++ 11 спецификации:статической инициализации порядка облом, iostream и 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
без риска статического фиаско инициализации.
К сожалению, этот код segfaults ... Почему? Я не думаю, что gcc 6.2.1 решил игнорировать спецификацию C++ 11, и я включил <iostream>
в A.cpp. Согласно спецификации, этого должно быть достаточно.
Пожалуйста, укажите точный код, который точно соответствует требованиям. – bmargulies
Выполнено (15 символов) – marmistrz
Это даже не компилируется. –