Para los futuros espectadores de esta pregunta, quiero señalar que deben evitar lo que monkey0506 sugiere .
Los archivos de encabezado son para declaraciones.
Los archivos de encabezado se compilan una vez por cada .cpp
archivo que los directa o indirectamente #includes
, y el código fuera de cualquier función se ejecuta en la inicialización del programa, antesmain()
.
Al poner: foo::i = VALUE;
en el encabezado, foo:i
se le asignará el valor VALUE
(lo que sea que sea) para cada .cpp
archivo, y estas asignaciones sucederán en un orden indeterminado (determinado por el vinculador) antes de main()
ejecutarse.
¿Qué pasa si somos #define VALUE
un número diferente en uno de nuestros .cpp
archivos? Se compilará bien y no tendremos forma de saber cuál gana hasta que ejecutemos el programa.
Nunca coloque el código ejecutado en un encabezado por la misma razón que nunca #include
un .cpp
archivo.
incluir guardias (que estoy de acuerdo en que siempre debe usar) lo protegen de algo diferente: el mismo encabezado se usa indirectamente #include
varias veces al compilar un solo .cpp
archivo