There are a couple of options. The first thing that came to my mind was that C++ allows static data members of class templates to be defined in more than one translation unit:
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;}
The linker will merge multiple definitions into one. But inline
alone is also able to help here and this solution is much simpler:
inline int& my_global() {
static int g = 24;
return g;
}
You can put this inline function into a header file and include it into many translation units. C++ guarantees that the reference returned by this inline function will always refer to the same object. Make sure that the function has external linkage.