2010-09-02 9 views
51

Tengo dos archivos fuente que necesitan acceder a una variable común. ¿Cuál es la mejor manera de hacer esto? por ejemplo:Variable global dentro de varios archivos

source1.cpp:

int global; 

int function(); 

int main() 
{ 
    global=42; 
    function(); 
    return 0; 
} 

source2.cpp:

int function() 
{ 
    if(global==42) 
     return 42; 
    return 0; 
} 

caso de que la declaración de la variable global ser estático, externo, o debe estar en un archivo de cabecera incluida por ambos archivos, etc.?

+0

Posible duplicado de [esta pregunta] (http://stackoverflow.com/questions/3591772/). – fredoverflow

+7

Vuelva a trabajar el código para usar algo que no sean variables globales, o vuelva a seleccionar la pregunta como "C".Cuando necesito un global en C++, normalmente lo hago un miembro estático de una clase que se puede leer públicamente a través de un método de acceso. Si el alcance se puede reducir para que solo los miembros de la clase interna usen el acceso, tanto mejor. Pocas variables son verdaderamente "globales". –

+1

depende de lo que quiera hacer – Chubsdad

Respuesta

78

La variable global debe ser declarada extern en un fichero de cabecera incluidos por tanto los archivos de origen, y luego definido en tan sólo uno de esos archivos de origen:

COMMON.H

extern int global; 

fuente1.cpp

#include "common.h" 

int global; 

int function(); 

int main() 
{ 
    global=42; 
    function(); 
    return 0; 
} 

source2.cpp

#include "common.h" 

int function() 
{ 
    if(global==42) 
     return 42; 
    return 0; 
} 
+2

Si desea más información y explicación sobre esto: http://stackoverflow.com/a/10422050/1218075 – Makesh

1

En un archivo que se declaran como en source1.cpp, en la segunda se declara como

extern int global; 

Por supuesto que realmente no quiere estar haciendo esto y probablemente debería enviar una pregunta sobre lo estás tratando de lograr para que la gente aquí te pueda dar otras formas de lograrlo.

+0

Debería lograr que el compilador obtenga la misma declaración externa para cada unidad de compilación, que necesita la declaración. Cuando extiendes los externos sobre todos los archivos que necesitan acceso externo a la variable, función, ... es difícil mantenerlos sincronizados. Es por eso que: no declare extern en el archivo .cpp consumidor. – harper

9

Se agrega un "archivo de cabecera", que describe la interfaz al módulo source1.cpp:

source1.h

#ifndef SOURCE1_H_ 
#define SOURCE1_H_ 

extern int global; 

#endif 

source2.h

#ifndef SOURCE2_H_ 
#define SOURCE2_H_ 

int function(); 

#endif 

y añadir una instrucción #include en cada archivo, que utiliza esta variable, y (importante) que define la variable.

source1.cpp

#include "source1.h" 
#include "source2.h" 

int global;  

int main()  
{  
    global=42;  
    function();  
    return 0;  
} 

source2.cpp

#include "source1.h" 
#include "source2.h" 

int function()    
{    
    if(global==42)    
     return 42;    
    return 0;    
} 

Si bien no es necesario, que sugieren el nombre source1.h para el archivo para mostrar que describe la interfaz pública a la módulo fuente1.cpp. De la misma manera, source2.h describe qué es público disponible en source2.cpp.