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.
+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. –
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). –
@AlexEngy: en este caso, es un int que probablemente se inicializará estáticamente sin la sobrecarga para thread-safty en inicializaciones dinámicas. – sellibitze