2010-09-19 15 views
5

Estoy intentando diseñar la biblioteca de solo encabezado, que desafortunadamente necesita tener una variable estática global (en clase o en el espacio de nombres).C++ variable estática

¿Hay alguna manera o solución preferida de tener variable estática global mientras se mantiene el diseño solo de encabezado?

El código es here

Respuesta

10

Hay un par de opciones. Lo primero que vino a mi mente fue que C++ permite a los miembros de datos estáticos de plantillas de clase que se definirán en más de una unidad de traducción:

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;} 

El enlazador se fusionará definiciones múltiples en una sola. Pero inline sola también es capaz de ayudar aquí y esta solución es mucho más sencilla:

inline int& my_global() { 
    static int g = 24; 
    return g; 
} 

Puede poner esta función en línea en un archivo de cabecera e incluirlo en muchas unidades de traducción. C++ garantiza que la referencia devuelta por esta función en línea siempre se referirá al mismo objeto. Asegúrese de que la función tenga un enlace externo.

+2

+1 local static es la forma más fácil con datos globales, especialmente dado que el nuevo estándar C++ 0x garantizará su inicialización correcta incluso en aplicaciones multiproceso. –

+0

También debo agregar que la segunda variante tiene una desventaja: g se inicializa solo en la primera llamada de my_global. Por lo tanto, el compilador insertará comparaciones, saltos y guardias de enhebrado en cada llamada, lo que hará que las llamadas sean más lentas (lo que podría ser importante en el caso del punto de entrada de la biblioteca). –

+0

@AlexEngy: en este caso, es un int que probablemente se inicializará estáticamente sin la sobrecarga para thread-safty en inicializaciones dinámicas. – sellibitze

Cuestiones relacionadas