温习C/C++宏定义

很早以前写过一篇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驱动中都大量的使用到了。


路.................................过.............................


你可能感兴趣的:(C,Windows,driver,Linux)