不鳥萬如一的各種垃圾彙總 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();
菜鸟一枚,仅供参考,多多指教。