頭文件中的宏定義

在工程中,寫一個模塊,師傅說,頭文件按找下面格式寫。程序員

知其然而不知其因此然,看到條件編譯就犯暈。函數

下面是學習後的理解和收穫,分享給你們。學習

代碼:spa

 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_ */

解釋:code

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

#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之間的內容刪除。it

意思是文件包含的頭文件中又同時包含了該.h文件,該文件只會定義一次。編譯

第3~12行:提供只在一個.h文件中定義一次就能夠在別的模塊中使用外部函數與變量的方法。(別的文件須要包含該頭文件)class

首先說明一下extern:

extern int i;

extern的用法:

一、變量

extern int a;//聲明一個全局變量a

int a; //定義一個全局變量a

extern int a =0 ;//定義一個全局變量a 並給初值。一旦給予賦值,必定是定義,定義纔會分配存儲空間。

int a =0;//定義一個全局變量a,並給初值,

該聲明編譯器提供的信息是,i 是int型變量 可是編譯器不會爲i分配存儲單元。上述聲明不是變量的定義,而是提示編譯器須要訪問定義在別處的變量。

變量在程序中能夠屢次聲明,但只能有一次定義。

二、函數

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();

  

這種用法既防止了重複包含,也防止了變量重複定義的錯誤,外部變量、外部函數也只僅僅在一個頭文件中聲明,而其餘文件只僅僅包含該文件便可。

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

相關文章
相關標籤/搜索