宏应用
1.#和##的用法
对于#,宏会把#的内容当作一个字符串来替换。比如:
#define CAT(c) “
于是:CAT(abc)就会被替换成:”
#define STR(c) #c
于是:STR(a) 就会被替换成:”a”
对于##,用于把两侧的参数合并为一个符号。比如:
#define combine(a,b,c) a##b##c
于是:combine(1,2,3)就会被替换成:123;而combine(“1”,”
2.求结构体成员偏移
#define offsetof(s,m) (size_t)&(((s
*)0)->m)
结构体成员偏移是指该成员距离结构体起始地址的距离。上面的宏定义中,s为结构体类型,m为结构体中的成员,比如:
typedef struct
{
int a;
char c;
}mysruct;
printf(“offset of c:%d\n”, offsetof(mystruct,c));//打印出c在结构体mystruct中的偏移。
3.计算数组长度
#define ARRAYSIZE(a) sizeof(a)/sizeof(a[0])
上面的宏定义,可以计算出一个数组元素的个数,比如:
int arr[]={1,3,7,11,2,6,10};
printf(“len of arr:%d\n”,ARRAYSIZE(arr));
4.软件工程中宏的应用:
文件的路径最大长度:
#define MAX_PATH 260
char szPath[MAX_PATH] = {0};
WDK中IRP操作方法IoCopyCurrentIrpStackLocationToNext(Irp)也是一个宏定义: