1. 程式人生 > >標頭檔案中的巨集定義 標頭檔案中的巨集定義

標頭檔案中的巨集定義 標頭檔案中的巨集定義

標頭檔案中的巨集定義

 

 

程式碼:

複製程式碼
 1 #ifndef DSP_ADC_BSP_H_    //防止標頭檔案被重複包含
 2 #define DSP_ADC_BSP_H_
 3 
 4 #ifdef _DSP_ADC_BSP_C_   //判斷是否被定義了
 5 #define ADCBSPEXT         //定義時執行
 6 #else
 7 #define ADCBSPEXT extern //未定義時執行
 8 #endif //_DSP_ADC_BSP_C_
 9 ADCBSPEXT int a;
10 ADCBSPEXT void InitileAdc(void);
11 ADCBSPEXT void CaptureAdcInt();
12 ADCBSPEXT unsigned char CaptureAdcInt_data();
13
14 #endif /* DSP_ADC_BSP_H_ */
複製程式碼

解釋:

第1、2行和第14行:防止重複包含。

#ifndef DSP_ADC_BSP_H_  //如果DSP_ADC_BSP_H_沒有被定義,則執行以下
#define DSP_ADC_BSP_H_ //定義DSP_ADC_BSP_H_
...
#endif /* DSP_ADC_BSP_H_ */ //註解是給程式設計師指明對應的#ifndef指令。

同一個檔案,在首次包含這個檔案時,沒有定義巨集DSP_ADC_BSP_H_,前處理器允許保留#ifndef和#endif之間的多行內容。

如果再次包含此檔案,前處理器將把#ifndef和#endif之間的內容刪除。

意思是檔案包含的標頭檔案中又同時包含了該.h檔案,該檔案只會定義一次。

第3~12行:提供只在一個.h檔案中定義一次就可以在別的模組中使用外部函式與變數的方法。(別的檔案需要包含該標頭檔案)

首先說明一下extern:

extern int i;

extern的用法:

1、變數

extern int a;//宣告一個全域性變數a

int a; //定義一個全域性變數a

extern int a =0 ;//定義一個全域性變數a 並給初值。一旦給予賦值,一定是定義,定義才會分配儲存空間。

int a =0;//定義一個全域性變數a,並給初值,

該宣告編譯器提供的資訊是,i 是int型變數 但是編譯器不會為i分配儲存單元。上述宣告不是變數的定義,而是提示編譯器需要訪問定義在別處的變數。

變數在程式中可以多次宣告,但只能有一次定義。

2、函式

extern  int func(void);

int func(void);   含義一樣

對於函式來說,沒有實體預設為宣告

extern可有可無

下面是正題:

複製程式碼
#ifdef _DSP_ADC_BSP_C_   //判斷_DSP_ADC_BSP_C_是否被定義
#define ADCBSPEXT //如果定義了執行,ADCBSPEXT為空白
#else
#define ADCBSPEXT extern //如果沒有定義執行,ADCBSPEXT為extern
#endif
ADCBSPEXT int i;
ADCBSPEXT void InitileAdc(void); //函式的宣告中,ADCBSPEXT可有可無,習慣加上。
ADCBSPEXT void CaptureAdcInt();
ADCBSPEXT unsigned char CaptureAdcInt_data();
複製程式碼

在與之對應模組的.c檔案中會有這麼一句話:

#define _DSP_ADC_BSP_C_ //定義了_DSP_ADC_BSP_C_ 

那麼當為本模組.c檔案時,ADCBSPEXT替換為空白。

宣告就是:

int a;
void InitileAdc(void); void CaptureAdcInt(); unsigned char CaptureAdcInt_data();

當為其他.c檔案用到這些函式式、外部變數,就需要包含這個標頭檔案,而其中的ADCBSPEXT替換為extern以提供使用。

extern int a;
extern void InitileAdc(void); extren void CaptureAdcInt(); extern unsigned char CaptureAdcInt_data();

  

這種用法既防止了重複包含,也防止了變數重複定義的錯誤,外部變數、外部函式也只僅僅在一個頭檔案中宣告,而其他檔案只僅僅包含該檔案即可。

這個方法也間接的方便了工程的管理。

 

程式碼:

複製程式碼
 1 #ifndef DSP_ADC_BSP_H_    //防止標頭檔案被重複包含
 2 #define DSP_ADC_BSP_H_
 3 
 4 #ifdef _DSP_ADC_BSP_C_   //判斷是否被定義了
 5 #define ADCBSPEXT         //定義時執行
 6 #else
 7 #define ADCBSPEXT extern //未定義時執行
 8 #endif //_DSP_ADC_BSP_C_
 9 ADCBSPEXT int a;
10 ADCBSPEXT void InitileAdc(void);
11 ADCBSPEXT void CaptureAdcInt();
12 ADCBSPEXT unsigned char CaptureAdcInt_data();
13
14 #endif /* DSP_ADC_BSP_H_ */
複製程式碼

解釋:

第1、2行和第14行:防止重複包含。

#ifndef DSP_ADC_BSP_H_  //如果DSP_ADC_BSP_H_沒有被定義,則執行以下
#define DSP_ADC_BSP_H_ //定義DSP_ADC_BSP_H_
...
#endif /* DSP_ADC_BSP_H_ */ //註解是給程式設計師指明對應的#ifndef指令。

同一個檔案,在首次包含這個檔案時,沒有定義巨集DSP_ADC_BSP_H_,前處理器允許保留#ifndef和#endif之間的多行內容。

如果再次包含此檔案,前處理器將把#ifndef和#endif之間的內容刪除。

意思是檔案包含的標頭檔案中又同時包含了該.h檔案,該檔案只會定義一次。

第3~12行:提供只在一個.h檔案中定義一次就可以在別的模組中使用外部函式與變數的方法。(別的檔案需要包含該標頭檔案)

首先說明一下extern:

extern int i;

extern的用法:

1、變數

extern int a;//宣告一個全域性變數a

int a; //定義一個全域性變數a

extern int a =0 ;//定義一個全域性變數a 並給初值。一旦給予賦值,一定是定義,定義才會分配儲存空間。

int a =0;//定義一個全域性變數a,並給初值,

該宣告編譯器提供的資訊是,i 是int型變數 但是編譯器不會為i分配儲存單元。上述宣告不是變數的定義,而是提示編譯器需要訪問定義在別處的變數。

變數在程式中可以多次宣告,但只能有一次定義。

2、函式

extern  int func(void);

int func(void);   含義一樣

對於函式來說,沒有實體預設為宣告

extern可有可無

下面是正題:

複製程式碼
#ifdef _DSP_ADC_BSP_C_   //判斷_DSP_ADC_BSP_C_是否被定義
#define ADCBSPEXT //如果定義了執行,ADCBSPEXT為空白
#else
#define ADCBSPEXT extern //如果沒有定義執行,ADCBSPEXT為extern
#endif
ADCBSPEXT int i;
ADCBSPEXT void InitileAdc(void); //函式的宣告中,ADCBSPEXT可有可無,習慣加上。
ADCBSPEXT void CaptureAdcInt();
ADCBSPEXT unsigned char CaptureAdcInt_data();
複製程式碼

在與之對應模組的.c檔案中會有這麼一句話:

#define _DSP_ADC_BSP_C_ //定義了_DSP_ADC_BSP_C_ 

那麼當為本模組.c檔案時,ADCBSPEXT替換為空白。

宣告就是:

int a;
void InitileAdc(void); void CaptureAdcInt(); unsigned char CaptureAdcInt_data();

當為其他.c檔案用到這些函式式、外部變數,就需要包含這個標頭檔案,而其中的ADCBSPEXT替換為extern以提供使用。

extern int a;
extern void InitileAdc(void); extren void CaptureAdcInt(); extern unsigned char CaptureAdcInt_data();

  

這種用法既防止了重複包含,也防止了變數重複定義的錯誤,外部變數、外部函式也只僅僅在一個頭檔案中宣告,而其他檔案只僅僅包含該檔案即可。

這個方法也間接的方便了工程的管理。