如何在多源文件程序中合理定義全局變量

 衆所周知,全局變量應該是得到內存分配且可以被其他模塊通過C語言中extern關鍵字調用的變量因此,必須在 .C 和 .H 文件中定義。這種重複的定義很容易導致錯誤。以下討論的方法只需用在頭文件中定義一次。雖然有點不易懂,但用戶一旦掌握,使用起來卻很靈活。表1.2中的定義出現在定義所有全局變量的.H頭文件中。
 
程序清單 L 1.2 定義全局宏。
#ifdef   xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif
   
.H 文件中每個全局變量都加上了xxx_EXT的前綴。xxx代表模塊的名字。該模塊的.C文件中有以下定義:
 
#define xxx_GLOBALS
#include "includes.h"
   
當編譯器處理.C文件時,它強制xxx_EXT(在相應.H文件中可以找到)爲空,(因爲xxx_GLOBALS已經定義)。所以編譯器給每個全局變量分配內存空間,而當編譯器處理其他.C文件時,xxx_GLOBAL沒有定義,xxx_EXT被定義爲extern,這樣用戶就可以調用外部全局變量。爲了說明這個概念,可以參見uC/OS_II.H,其中包括以下定義:
#ifdef   OS_GLOBALS             //22
#define OS_EXT
#else
#define OS_EXT extern
#endif
 
OS_EXT INT32U       OSIdleCtr;
OS_EXT INT32U       OSIdleCtrRun;
OS_EXT INT32U       OSIdleCtrMax;
 
同時,uCOS_II.C有中以下定義:
 
#define OS_GLOBALS
#include “includes.h”
 
當編譯器處理uCOS_II.C時,它使得頭文件變成如下所示,因爲OS_EXT被設置爲空。
 
INT32U       OSIdleCtr;
INT32U       OSIdleCtrRun;
INT32U       OSIdleCtrMax;
   
這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因爲OS_GLOBAL沒有定義,所以OS_EXT被定義爲extern。
 
extern INT32U       OSIdleCtr;
extern INT32U       OSIdleCtrRun;
extern INT32U       OSIdleCtrMax;
   
在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章