2010-09-19 20 views
5

Sto provando a progettare solo la libreria di intestazione, che sfortunatamente deve avere una variabile statica globale (in classe o nello spazio dei nomi).Variabile statica C++

Esiste un modo o una soluzione preferita per avere una variabile statica globale pur mantenendo la progettazione dell'intestazione?

Il codice è here

risposta

10

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.

+2

+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. –

+0

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). –

+0

@AlexEngy: In questo caso, è un int che sarà probabilmente inizializzato staticamente senza l'overhead per thread-safty nelle inizializzazioni dinamiche. – sellibitze

Problemi correlati