首页 > C > 阅读:57,774

宏应用

< 上一页 宏替换 宏的二义性 下一页 >

1.###的用法

对于#,宏会把#的内容当作一个字符串来替换。比如:

#define CAT(c) “123”#c

于是:CAT(abc)就会被替换成:123””abc”à”123abc”

#define STR(c) #c

于是:STR(a) 就会被替换成:”a”

对于##,用于把两侧的参数合并为一个符号。比如:

#define combine(a,b,c) a##b##c

于是:combine(1,2,3)就会被替换成:123;而combine(“1”,”2”,”3”)则会被替换为:123”

 

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};

WDKIRP操作方法IoCopyCurrentIrpStackLocationToNext(Irp)也是一个宏定义:

 

< 上一页 宏替换 宏的二义性 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注