Prosta odpowiedź na twoje pytanie brzmi: nie. Jak inni wskazali, gwarancje dla obiektów zdefiniowanych w jednostkach translacjizapewniają obiekty zdefiniowane w jednostkach translacyjnych , w tym <iostream>
, co najmniej, jeśli obiekt jest zdefiniowany po włączeniu do obiektu. Ale to nie zawsze pomaga: dodajesz <iostream>
w jednostce tłumaczeniowej, która definiuje konstruktora, niekoniecznie w tym, który definiuje zmienną statyczną. Możliwe są przypadki, tak jak na poniższym :
file1.hh
class X
{
public:
X();
};
file1.cc
#include "file1.hh"
#include <iostream>
X::X()
{
std::cout << "Coucou, me voila!" << std::endl;
}
file2.cc
#include "file1.hh"
X anX;
W tym przypadku, jest to całkiem możliwe, że konstruktor anX
zostanie wywołany przed std::cout
jest zbudowany.
Aby być na bezpiecznej stronie: jeśli konstruktor obiektu, który może być używany jako zmienna statyczna chce wykorzystać dowolny ze standardowych strumieni, to prawdopodobnie powinien zadeklarować lokalne statyczne typu ios_base::Init
:
X::X()
{
static ios_base::Init dummyForInitialization;
std::cout << "Coucou, me voila!" << std::endl;
}
Jeśli std::cout
nie został jeszcze skonstruowany, gdy wywoływany jest ten konstruktor , będzie to oznaczać, gdy zostanie zbudowana zmienna statyczna.
'main' nie jest jedyną rzeczą, którą napisałby programista. Globały i statyka również są kandydatami. – Ajay
@Ajay: Rzeczywiście, dlatego 'main' nie jest jedyną rzeczą, o której wspomniałem. Jak już powiedziałem, strumienie są gwarantowane, że zostaną utworzone przed zadeklarowanym statycznym obiektem, włączając w to ''. –
Nie mówię, że jesteś w błędzie Mike, ale wątpię. Dlaczego: Mogę mieć wiele nagłówków, zawartych we właściwej kolejności (lub nie). Nie ma gwarancji, że pierwsze nagłówki zostaną umieszczone w fazie inicjacji łącznika/modułu ładującego w danej sekwencji. A może jest gwarancja? Jeśli nie, włączenie '' jest niczym innym jak włączeniem tekstu. Tak, mam świadomość, że rzeczywisty kod klasy strumienia znajduje się w bibliotece uruchomieniowej (DLL, SO lub static-lib). Jeśli tak, to czy obiekty DLL/SO/LIB zostaną najpierw zainicjowane? I znowu, jaka jest gwarancja tego zamówienia? –
Ajay