2010-09-02 123 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中的公共可用內容。