¿Cómo evitar que las definiciones en cabeceras se copien en cada UdT? (Unidad de Traducción)


Tengo una función de definida en una cabecera que es llamada en la propia cabecera:

a.hpp

namespace AAAAA {  namespace {  static int init() { std::cout << __PRETTY_FUNCTION__ << '\n'; return 42; } //         ^^^^^^ <--- Definida en cabecera.  }  void f();  static int i = init(); //             ^^^^^^ <--- Llamada en cabecera. } 

La cabecera a.hpp se incluye en dos archivos:

a.cpp

#include "a.hpp" // Contiene la definición y llamada a 'init()'  #include <iostream>  namespace AAAAA {  void f() {     std::cout << __PRETTY_FUNCTION__ << " : " << i << '\n'; }  } 

main.cpp

#include "a.hpp" // Contiene la definición y llamada a 'init()' #include <iostream>  int main() {     AAAAA::f();     return 0; } 

Al ejecutar el programa obtengo la siguiente salida:

int AAAAA::(anonymous namespace)::init() int AAAAA::(anonymous namespace)::init() void AAAAA::f() : 42 

Se ha llamado dos veces a init, una desde la UdT de main y otra desde la UdT de a, esta múltiple llamada a la función se repite por cada UdT añadida en que se incluya a.hpp:

b.hpp

namespace BBBBB {  void f();  } 

b.cpp

#include "b.hpp" #include "a.hpp" // Contiene la definición y llamada a 'init()'  #include <iostream>  namespace BBBBB {  void f() {     std::cout << __PRETTY_FUNCTION__ << " : " << AAAAA::i << '\n'; }  } 

main.cpp

#include "a.hpp" #include "b.hpp"  #include <iostream>  int main() {     AAAAA::f();     BBBBB::f();     return 0; } 

La nueva salida con los cambios anteriores:

int AAAAA::(anonymous namespace)::init() int AAAAA::(anonymous namespace)::init() int AAAAA::(anonymous namespace)::init() void AAAAA::f() : 42 void BBBBB::f() : 42 

Cada UdT en que se incluya a.hpp obtiene una copia de AAAAA::i (pese a que AAAAA::i es static) por lo tanto cada una hace una llamada a init.

¿Cómo puedo evitar que se haga una copia de AAAAA::i en cada UdT y en consecuencia se llame init por cada copia de dicha variable?