宏定义 do while(0)分析

在宏定义里面经常看到do{...}while(0)这样的语句。

确实很让人疑惑,do while(0)就是让代码只执行一次,何必这样呢,为什么需要用do while呢。

其实,宏定义就是一个代码替换的过程。

#define CODE_SEG(a) printf("sample macro:%s\n",a) 

那么在出现了CODE_SEG(some_str)的地方,它都会在编译时被替换成printf("sample 


macro:s\n",some_str)


那么,我们写代码的习惯都是

...

char*s="hello world";

CODE_SEG(s);   //我们会习惯性地加上分号

...


这时,可以编译通过,因为 CODE_SEG(s);  被替换成了printf("sample macro:%s\n",s);


但是,如果我们的宏里面有不止一条语句,比如

#define CODE_SEG(a) {printf("sample macro:%s\n",a);printf("done\n");} 

这样就行不通了,因为CODE_SEG(s); 会被替换成

{printf("sample macro:%s\n",a);printf("done\n");};  最后面这个分号回导致编译不通过


因此,通常用do while(0)来包裹,这样就可以避免这个分号的问题

#define CODE_SEG(a) do{printf("sample macro:%s\n",a);printf("done\n");}while(0)

 CODE_SEG(s); 会被替换成

do{printf("sample macro:%s\n",a);printf("done\n");}while(0);

最后的这个分号此时就是恰到好处了,编译通过。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值