#define #include #undef的其中一个用法(目的)
一、背景 最近在跟一段系统级的代码,和原来单纯的下位机代码相比,真的是刘姥姥进大观园——看花了眼。相较于 之前所常见的各种下位机代码,系统级代码常常会出现深层次结构体嵌套,结构体内的各种回调函数导致对函数 指针的赋值调用也成为常态,以及各种各样的宏定义等等,均让人有一种眼前一亮、耳目一新的既视感。由于 对宏了解不多,也就对此处我在实际代码碰到过的#define,#include,#undef的使用的其中一个目的做个 记录。 二、正文 实际代码如下: #define _MCARO_1 #include "Myheadfile.h" #undef _MACRO_1 紧接着的代码: #define _MCARO_2 #include "Myheadfile.h" #undef _MACRO_2 出现这段代码的作用即重复包含了两次头文件"Myheadfile.h",可意义在哪?接着跟头文件内的代码, 该头文件的作用是声明定义了一张类似于表格的变量,表格即是通过定义普通数组或者结构体数组来实现。而在 该头文件内出现了如下宏: #if defined (_MCARO_1) ··· 对表格实际的各个变量的声明; ··· #elif defined (_MACRO_2) ··· 对表格实际的各个变量的声明; ··· 从代码上来分析,重复包含两次头文件的意义就在于根据宏定义的不同来申请两种不同的变量。 以我碰到的实际代码来说,该工程实际上是要实现一个CANopen设备,CANopen设备通过对象字典来描述其功 能,以及通过对象字典来与外界交互,对象字典代码上实现就相当于一个表格,(关于CANopen对象字典以后会另外 开篇博客详述),在CANopen设备初始化的时候,CANopen设备会通过默认的对象字典来实现其预定义的功能,但在 CANopen设备实际运行起来时,又会按照不同的工业现场情况被CANopen主设备配置成适应当时需求的从设备,对象 字典内的参数也因此会被更改,但该设备被应用到其他场合时,它还是应该以默认的CANopen设备进行初始化。 上述代码既是实现了这种需求: 当其"define_MACRO_1"时,在该头文件内声明的变量空间为CANopen默认的对象字典参数。 当其"define_MACRO_2"时,在该头文件内声明的变量空间为CANopen实际运行的可被更改的对象字典参数。
两个对象字典参数并存于同一段代码中,而互不干涉。 因此,综上所述,#define,#include,#undef 在使用时,会在被包含的头文件内按照定义的宏进行特定的 操作,而同时再被包含时,由于宏的不同,其不会出现再次重复定义的错误。 再补充一个带参宏的用法: #define Test(par) Function(par); void Function(int par); int main(void) { Test(par); //中间若是加空格也可以调用Function(par); Test (par); } 也即是说,定义带参数的宏,在定义时,宏与参数之间不得有空格,但在调用时,则可以有空格。 至此,记录完毕。 记录时间:2016-10-31 记录地点:深圳WZ