看見頭文件中的條件編譯就犯怵,不知什麼意思,但是,師傅說:”就得那麼寫“,我照做,但是知其然而不知其所以然。 好吧,我承認自己只是一個代碼的搬運工,哦,不,或許還談不上。 下麵是學習後自己的理解~~~ 代碼: 也許我渣把,總之,之前我確實不會。 解釋: 第1、2行和第14行:防止重覆定義。 如果兩個 ...
看見頭文件中的條件編譯就犯怵,不知什麼意思,但是,師傅說:”就得那麼寫“,我照做,但是知其然而不知其所以然。
好吧,我承認自己只是一個代碼的搬運工,哦,不,或許還談不上。
下麵是學習後自己的理解~~~
代碼:
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 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之間的內容刪除。
意思是如果兩個.c文件同時包含了該.h文件,只會定義一次。
第3~12行:提供只在.h文件中只定義一次就可以在別的模塊中使用外部函數與變數的方法。
首先說明extern:
extern int i;
該聲明編譯器提供的信息是,i 是int型變數 但是編譯器不會為i分配存儲單元。上述聲明不是變數的定義,而是提示編譯器需要訪問定義在別處的變數。
變數在程式中可以多次聲明,但只能有一次定義。
#ifdef _DSP_ADC_BSP_C_ //判斷_DSP_ADC_BSP_C_是否被定義
#define ADCBSPEXT //如果定義了執行
#else
#define ADCBSPEXT extern //如果沒有定義執行
#endif
ADCBSPEXT void InitileAdc(void);
ADCBSPEXT void CaptureAdcInt();
ADCBSPEXT unsigned char CaptureAdcInt_data();
在與之對應模塊的.c文件中會有這麼一句話:
#define _DSP_ADC_BSP_C_ //定義了_DSP_ADC_BSP_C_
那麼當為本模塊.c文件時,ADCBSPEXT替換為空白。
函數聲明就是:
void InitileAdc(void); void CaptureAdcInt(); unsigned char CaptureAdcInt_data();
當為其他.c文件用到這些函數式,ADCBSPEXT替換為extern以提供使用。
extern void InitileAdc(void); extren void CaptureAdcInt(); extern unsigned char CaptureAdcInt_data();
菜鳥一枚,僅供參考,多多指教。