c语言中头文件中的宏定义

不鳥萬如一的各種垃圾彙總 2017-12-03

看见头文件中的条件编译就犯怵,不知什么意思,但是,师傅说:”就得那么写“,我照做,但是知其然而不知其所以然。

好吧,我承认自己只是一个代码的搬运工,哦,不,或许还谈不上。

下面是学习后自己的理解~~~

代码:

#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 void InitileAdc(void);
 ADCBSPEXT void CaptureAdcInt();
 ADCBSPEXT unsigned char CaptureAdcInt_data();
 
 #endif /* DSP_ADC_BSP_H_ */

也许我渣把,总之,之前我确实不会。

解释:

第1、2行和第14行:防止重复定义。

#ifndef DSP_ADC_BSP_H_  //如果DSP_ADC_BSP_H_没有被定义,则执行以下<br />#define DSP_ADC_BSP_H_  //定义DSP_ADC_BSP_H_ <br />...<br />#endif  /* DSP_ADC_BSP_H_ */  //注解是给程序员指明对应的#ifndef指令。

如果两个.c文件同时包含了该.h文件,只会定义一次。

第3~12行:提供只在.h文件中只定义一次就可以在别的模块中使用外部函数与变量的方法。

#ifdef _DSP_ADC_BSP_C_   //判断_DSP_ADC_BSP_C_是否被定义<br />#define ADCBSPEXT        //如果定义了执行<br />#else <br />#define ADCBSPEXT extern //如果没有定义执行<br />#endif <br /><br />ADCBSPEXT void InitileAdc(void); <br />ADCBSPEXT void CaptureAdcInt();<br />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();

菜鸟一枚,仅供参考,多多指教。

相关推荐