Si lo que necesitas es una misma variable accesible desde distintos cpp, deberías declararla "extern", pero ya no sería posible que fuera "static", porque en este sentido son contradictorias.
Por ejemplo:
en Archivo1.h
en Archivo2.h
en Archivo1.cpp
en main.cpp
Salida:
Al declararla como "extern" le dices al compilador que está definida en algún otro lado, y es conocida en todo el programa, en cualquier cpp donde se incluya su declaración (por medio de #include Archivo2.h).
Esto mismo también puede hacerse (a partir de C++17) con
Archivo2.h
Y ya no necesitas definir x::num en ninguno de los cpp.
Por ejemplo:
en Archivo1.h
Código [Seleccionar]
#pragma once
struct Archivo1 {
void printVal() const;
};
en Archivo2.h
Código [Seleccionar]
#pragma once
namespace x {
extern int num; // no puede ser static
}
en Archivo1.cpp
Código [Seleccionar]
#include "Archivo1.h"
#include "Archivo2.h"
#include <iostream>
void Archivo1::printVal() const {
std::cout << "Desde Archivo1 -> " << x::num << " Memoria : " << &x::num << '\n';
}
en main.cpp
Código [Seleccionar]
#include <iostream>
#include "Archivo2.h"
#include "Archivo1.h"
int x::num = 10; // definida aquí o en cualquier otro cpp
int main() {
std::cout << "Desde main -> " << x::num << " Memoria : " << &x::num << '\n';
Archivo1 a;
a.printVal();
return 0;
}
Salida:
Código [Seleccionar]
Desde main -> 10 Memoria : 00FBC000 // mismo valor, misma dirección de memoria.
Desde Archivo1 -> 10 Memoria : 00FBC000
Al declararla como "extern" le dices al compilador que está definida en algún otro lado, y es conocida en todo el programa, en cualquier cpp donde se incluya su declaración (por medio de #include Archivo2.h).
Esto mismo también puede hacerse (a partir de C++17) con
Archivo2.h
Código [Seleccionar]
#pragma once
namespace x {
inline int num = 10;
}
Y ya no necesitas definir x::num en ninguno de los cpp.