tipos - Cómo declarar una variable global en C++
que es declaracion de variables (3)
He leído que cualquier variable declarada fuera de una función es una variable global. Lo he hecho, pero en otro archivo * .cpp esa variable no se pudo encontrar. Entonces no fue realmente global.
De acuerdo con el concepto de alcance , su variable es global. Sin embargo, lo que has leído / entendido es demasiado simplificado.
Posibilidad 1
Tal vez se olvidó de declarar la variable en la otra unidad de traducción (TU). Aquí hay un ejemplo:
a.cpp
int x = 5; // declaration and definition of my global variable
b.cpp
// I want to use `x` here, too.
// But I need b.cpp to know that it exists, first:
extern int x; // declaration (not definition)
void foo() {
cout << x; // OK
}
Normalmente colocarías extern int x;
en un archivo de cabecera que se incluye en b.cpp , y también en cualquier otra TU que termine necesitando usar x
.
Posibilidad 2
Además, es posible que la variable tenga una vinculación interna , lo que significa que no está expuesta en las unidades de traducción. Este será el caso por defecto si la variable está marcada const
( [C++11: 3.5/3]
):
a.cpp
const int x = 5; // file-`static` by default, because `const`
b.cpp
extern const int x; // says there''s a `x` that we can use somewhere...
void foo() {
cout << x; // ... but actually there isn''t. So, linker error.
}
Puede solucionar esto aplicando extern
a la definición también:
a.cpp
extern const int x = 5;
Todo este malarky es más o menos equivalente al desorden al que se somete haciendo que las funciones sean visibles / utilizables a través de los límites de TU, pero con algunas diferencias en la forma de hacerlo.
Sé que no se deben usar variables globales, pero las necesito. He leído que cualquier variable declarada fuera de una función es una variable global. Lo he hecho, pero en otro archivo * .cpp esa variable no se pudo encontrar. Entonces no fue realmente global. ¿No es así que uno tiene que crear un archivo de cabecera GlobalVariabels.h e incluir ese archivo en cualquier otro archivo * cpp que lo use?
Además de otras respuestas aquí, si el valor es una constante integral, una enumeración pública en una clase o estructura funcionará. Una variable, constante o no, en la raíz de un espacio de nombres es otra opción, o un miembro público estático de una clase o estructura es una tercera opción.
MyClass::eSomeConst (enum)
MyNamespace::nSomeValue
MyStruct::nSomeValue (static)
Usted declara la variable como extern
en un encabezado común:
//globals.h
extern int x;
Y defínalo en un archivo de implementación.
//globals.cpp
int x = 1337;
A continuación, puede incluir el encabezado donde sea que necesite acceder.
Sugiero que también envuelva la variable dentro de un namespace
.