La semplice risposta alla tua domanda è no. Come altri hanno sottolineato, sono garanzie per gli oggetti definiti nelle unità di traduzione compreso <iostream>
, almeno se l'oggetto è definito dopo l'inclusione di . Ma questo non sempre aiuta: si include <iostream>
in l'unità di traduzione che definisce il costruttore, non necessariamente in quello che definisce la variabile statica. Così casi come il seguente sono possibili:
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;
In questo caso, è molto probabile che il costruttore di anX
sia chiamato prima std::cout
è costruito.
Per essere sul sicuro: se il costruttore di un oggetto che potrebbe essere usato come una variabile statica vuole utilizzare uno dei flussi standard, si probabilmente dovrebbe dichiarare una statica locale di tipo ios_base::Init
:
X::X()
{
static ios_base::Init dummyForInitialization;
std::cout << "Coucou, me voila!" << std::endl;
}
Se non è già stato creato quando questo costruttore è chiamato, sarà quando viene creata la variabile statica.
fonte
2014-11-21 11:18:41
"main" non è l'unica cosa, un programmatore dovrebbe scrivere. Globali e statici sono anche candidati. – Ajay
@ Ajay: In effetti, ecco perché "main" non è l'unica cosa che ho menzionato. Come ho detto, gli stream sono garantiti per essere creati prima di qualsiasi oggetto statico dichiarato dopo aver incluso ''. –
Non sto dicendo che ti sbagli Mike, ma dubito. Perché: potrei avere più intestazioni, incluse nella sequenza corretta (o meno). Non vi è alcuna garanzia che le prime intestazioni verranno inserite nella fase di inizializzazione del linker/loader in quella determinata sequenza. O c'è garanzia? Se no, l'inclusione di "" non è altro che inclusione di testo. Sì, sono consapevole che il codice effettivo della classe stream risiede nella libreria di runtime (DLL, SO o static-lib). In questo caso, è garantito che gli oggetti DLL/SO/LIB vengano inizializzati per primi? Di nuovo, qual è la garanzia di ordine lì? –
Ajay