天天看點

C語言中關于全局變量的深入了解及使用方式

以前覺得全局變量很簡單,沒有好好思考和了解,看到其他項目中的一些用法不太了解,最近正好有空,好好梳理了一下關于全局變量的定義和引用。

總的來說,有以下幾種方式:

方式1:全局變量定義在源檔案中,在需要引用該全局變量的其他源檔案中進行聲明即可
方式2:全局變量定義在源檔案中,在其頭檔案中進行聲明,其他需要引用該全局變量的源檔案隻需包括頭檔案即可
方式3:通過定義宏的方式根據條件決定是定義還是引用,通用性更強

具體如下,在常見的頭檔案#ifndef、#define、#endif之中,還加了一段,宏定義了#define ADCBSPEXT,從程式可以看出,當一個.c檔案開頭宏定義了ADCBSPEXT之後,ADCBSPEXT就為空,下面的變量就變成了定義;當.c檔案當中沒有宏定義ADCBSPEXT時,ADCBSPEXT就為extern,下面的變量就變成了申明。起到了雙關的作用。

#ifndef DSP_ADC_BSP_H_    //防止頭檔案被重複包含
#define DSP_ADC_BSP_H_
 
#ifdef _DSP_ADC_BSP_C_   //判斷是否被定義了
#define ADCBSPEXT         //定義時執行
#else
#define ADCBSPEXT extern //未定義時執行
#endif //_DSP_ADC_BSP_C_
ADCBSPEXT int a;
ADCBSPEXT void InitileAdc(void); 
ADCBSPEXT void CaptureAdcInt(); 
ADCBSPEXT unsigned char CaptureAdcInt_data();
 
#endif /* DSP_ADC_BSP_H_ */
           

使用上面這種形式的寫法時,在頭檔案對應的源檔案開頭加上自己名稱宏定義就可以了:

#define _DSP_ADC_BSP_C_ 
#include "xxx.h"
           

其他引用該全局變量的源檔案不加。

BTW:源檔案中采用#include "xxx.h"包含頭檔案,編譯器在進行預處理時,要對#include指令進行“檔案包含處理”:将xxx.c的全部内容複制到#include “xxx.h”處。是以上面的語句中宏定義#define _DSP_ADC_BSP_C_要放在#include "xxx.h"之前,這個是了解上面内容的關鍵。

另外延伸一下,對于函數的聲明,前面一般不加extern,因為函數的聲明和函數的定義(有實作)形式不一樣,系統能夠自動區分函數是聲明還是定義,是以我們的函數聲明系統預設就是extern,是以我們直接把函數原型放在頭檔案即可。

參考的文章連結如下:

1.C項目中變量、宏定義、結構體等聲明定義位置問題(頭檔案、源檔案)

2.c++怎麼把頭檔案和源檔案連起來_源檔案與頭檔案關聯

繼續閱讀