很早以前写过一篇C宏定义相关文章。
今天用VS2015建了一个windows驱动的工程,上一次工作写了一个WDF USB驱动还是2010年,准确说是KMDF的驱动。看了一下驱动结构,结构基本没怎么变,但发现多了相当多的宏定义,如果你是高手就绕道行吧,这里在温习一下宏定义相关的东西 :-(
一. 初级用法
#define to_string(a) #a// 把参数a转换成字符串
#define to_char(a) #@a// 把参数a转换成字符
#define to_connect(a, b) a ## b// 把参数a和参数b组合相连
使用(注释是运行结果):
char *s1 = to_string(abc);// "abc"
char *s2 = to_connect("a", "b");// "ab"
int i1 = to_connect(1, 2);// 12
char i2 = to_char(a);// 'a'
int i3 = to_char(3);// 51
二. 高级的用法
使用场景:假如我们有很多种动物(猫,狗,鸡等等),都需想用一个结构体来定义,再假如结构体都只想描述动物的重量和身高,但又不想所有动物的结构体名称一致。
实际应用中C++会使用类,这里只是假设哈。
假如结构体都想用Animal_打头,如Animl_Cat,同样我们用宏定义来实现:
#define StructureType(type) struct Animal_ ## type { \
float weight; \
float height; \
};
使用:
StructureType(Cat);// 定义一个Animl_Cat结构体
struct Animal_Cat cat;// 实例化一个Animl_Cat
cat.weight = 10;
cat.weight = 30;
你可能在想,我想定义一个新的动物结构体,增加一个动物属性,那就结合上面的组合方式
#define StructureTypeEx(type, member) struct Animal_ ## type { \
float weight; \
float height; \
char* ## member; \
};
使用:
StructureTypeEx(Dog, Name);// 定义了一个动物名
Animal_Dog dog;
dog.height = 60;
dog.weight = 100;
dog.Name = (char *)malloc(32);
memset(dog.Name, 0, 32);
strcpy_s(dog.Name, 7, "HuaHua");
第二种用法linux和windows驱动中都大量的使用到了。
路.................................过.............................