头文件中的宏定义
2018-06-18 03:55:57来源:未知 阅读 ()
在工程中,写一个模块,师傅说,头文件按找下面格式写。
知其然而不知其所以然,看到条件编译就犯晕。
下面是学习后的理解和收获,分享给大家。
代码:
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_ */
解释:
第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之间的内容删除。
意思是文件包含的头文件中又同时包含了该.h文件,该文件只会定义一次。
第3~12行:提供只在一个.h文件中定义一次就可以在别的模块中使用外部函数与变量的方法。(别的文件需要包含该头文件)
首先说明一下extern:
extern int i;
extern的用法:
1、变量
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
int a =0;//定义一个全局变量a,并给初值,
该声明编译器提供的信息是,i 是int型变量 但是编译器不会为i分配存储单元。上述声明不是变量的定义,而是提示编译器需要访问定义在别处的变量。
变量在程序中可以多次声明,但只能有一次定义。
2、函数
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();
这种用法既防止了重复包含,也防止了变量重复定义的错误,外部变量、外部函数也只仅仅在一个头文件中声明,而其他文件只仅仅包含该文件即可。
这个方法也间接的方便了工程的管理。
转载请表明出处:http://www.cnblogs.com/zhengluyao/p/7958628.html
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- QT5 解析JSON文件 2020-06-09
- C++ 类 2020-06-02
- 二叉搜索树_BST 2020-05-30
- QTableView与Excel之间的文件打开与保存 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash