2010-09-02 215 views
51

我有两个需要访问公共变量的源文件。做这个的最好方式是什么?例如:多个文件中的全局变量

source1.cpp:

int global; 

int function(); 

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

source2.cpp:

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

应变量全球的声明是静态的,EXTERN,还是应通过包含头文件两个文件等?

+0

[此问题]可能重复(http://stackoverflow.com/questions/3591772/)。 – fredoverflow 2010-09-02 14:14:10

+7

重做代码以使用全局变量以外的内容 - 或将问题重新标记为“C”。当我需要C++中的全局语言时,我通常会将其设置为通过访问方法公开可读的类的静态成员。如果可以缩小范围以便只有内部类成员使用访问者,那就更好了。几乎没有变数是真正的“全球”。 – 2010-09-02 14:14:51

+1

取决于你想要做什么 – Chubsdad 2010-09-02 14:24:51

回答

78

全局变量应声明在由两个源文件包括一个头文件extern,然后在只有那些源文件中的一个来定义:

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

如果你想要更多的信息和解释这背后:http://stackoverflow.com/a/10422050/1218075 – Makesh 2017-04-27 09:02:54

1

在一个文件中声明它作为source1.cpp,在第二次声明它作为

extern int global; 

当然你真的不希望被这样做的,或许应该张贴有关的问题是什么你正试图达到这个目标,这里的人们可以给你其他的实现方式。

+0

您应该达到编译器为每个需要声明的编译单元获取相同的extern声明。当你将extern扩展到需要外部访问变量,函数的所有文件时,很难保持同步。 这就是为什么:不要在使用.cpp文件中声明extern。 – harper 2010-09-02 14:29:16

9

你添加一个 “头文件”,描述到模块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 

,并添加在每个文件中的#include语句,它使用该变量,和(重要)定义变量。

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;    
} 

虽然这是没有必要的,我建议名称source1.h的文件表明,它描述的公共接口模块source1.cpp。以同样的方式,source2.h描述了source2.cpp中的公共可用内容。