头文件中的宏定义

头文件中的宏定义

 

 

代码:html

复制代码
 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_ */
复制代码

解释:程序员

第一、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之间的多行内容。post

若是再次包含此文件,预处理器将把#ifndef和#endif之间的内容删除。url

意思是文件包含的头文件中又同时包含了该.h文件,该文件只会定义一次。spa

第3~12行:提供只在一个.h文件中定义一次就能够在别的模块中使用外部函数与变量的方法。(别的文件须要包含该头文件)code

首先说明一下extern:htm

extern int i;

extern的用法:blog

一、变量get

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

  

这种用法既防止了重复包含,也防止了变量重复定义的错误,外部变量、外部函数也只仅仅在一个头文件中声明,而其余文件只仅仅包含该文件便可。

这个方法也间接的方便了工程的管理。

相关文章
相关标签/搜索