Ci sono un paio di opzioni. La prima cosa che mi venne in mente fu che C++ permette ai membri di dati statici di modelli di classe per essere definiti in unità più di una traduzione:
template<class T>
struct dummy {
static int my_global;
};
template<class T>
int dummy<T>::my_global;
inline int& my_global() {return dummy<void>::my_global;}
Il linker unire più definizioni in uno solo. Ma inline
da solo è anche in grado di aiutare qui e questa soluzione è molto più semplice:
inline int& my_global() {
static int g = 24;
return g;
}
si può mettere questa funzione inline in un file di intestazione e includerlo in molte unità di traduzione. C++ garantisce che il riferimento restituito da questa funzione inline farà sempre riferimento allo stesso oggetto. Assicurarsi che la funzione abbia un collegamento esterno.
+1 statico locale è il modo più semplice con dati globali, soprattutto perché il nuovo standard C++ 0x garantirà la corretta inizializzazione anche in un'applicazione multithread. –
Dovrei anche aggiungere che la seconda variante ha uno svantaggio - g è inizializzata solo alla primissima chiamata di my_global. Quindi il compilatore inserirà comparazioni, salti e protezioni di threading in ogni chiamata, il che renderà le chiamate lente (che potrebbe essere importante nel caso del punto di ingresso della libreria). –
@AlexEngy: In questo caso, è un int che sarà probabilmente inizializzato staticamente senza l'overhead per thread-safty nelle inizializzazioni dinamiche. – sellibitze