2010-09-02 7 views
51

J'ai deux fichiers source qui doivent accéder à une variable commune. Quelle est la meilleure façon de procéder? par exemple:Variable globale dans plusieurs fichiers

source1.cpp:

int global; 

int function(); 

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

source2.cpp:

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

Si la déclaration de la variable globale statique, extern, ou doit-il être dans un fichier d'en-tête inclus par les deux fichiers, etc?

+0

Possible copie de [cette question] (http://stackoverflow.com/questions/3591772/). – fredoverflow

+7

Retravailler le code pour utiliser autre chose que des variables globales - ou repasser la question en "C".Quand j'ai besoin d'un global en C++, je le rends typiquement membre statique d'une classe qui est publiquement lisible via une méthode d'accesseur. Si la portée peut être réduite afin que seuls les membres internes de la classe utilisent l'accesseur, tant mieux. Peu de variables sont vraiment «globales». –

+1

dépend de ce que vous voulez faire – Chubsdad

Répondre

78

La variable globale doit être déclarée extern dans un fichier d'en-tête inclus par les fichiers source, puis défini dans une seule de ces fichiers source:

common.h

extern int global; 

source1.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 vous voulez plus d'informations et d'explications derrière ceci: http://stackoverflow.com/a/10422050/1218075 – Makesh

1

Dans un fichier que vous déclarez-le comme dans source1.cpp, dans le second vous déclarez comme

extern int global; 

Bien sûr, vous ne voulez pas vraiment faire cela et devrait probablement poser une question sur ce vous essayez d'atteindre les objectifs afin que les gens ici puissent vous donner d'autres moyens d'y parvenir.

+0

Vous devriez obtenir que le compilateur obtienne la même déclaration externe pour chaque unité de compilation, qui a besoin de la déclaration. Lorsque vous répartissez les externs sur tous les fichiers nécessitant un accès externe à la variable, function, ... il est difficile de les synchroniser. C'est pourquoi: ne déclarez pas extern dans le fichier .cpp consommateur. – harper

9

Vous ajoutez un "fichier d'en-tête", qui décrit l'interface au module 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 

et ajoutez une instruction #include dans chaque fichier, qui utilise cette variable, et (important) qui définit 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;    
} 

Bien qu'il soit pas nécessaire, je suggère le nom source1.h pour le dossier que décrit l'interface publique au module source1.cpp. De la même manière, source2.h décrit ce qui est public dans source2.cpp.