#define

如果你想在宏中包含多个语句,可能会这样写:
#define do_something() \
do_a(); \
do_b();
\ 表示强制换行,而换行后的内容与前一行的内容编译器仍把它看作是同一行.

#define后面定义的内容比须在同一行,而有时是为了让程序便于阅读,从中间进行换行,如果没有符号'\',则我们的换行表示 #define的结束,这也是为什么你去掉后会报错的原因.如果在这里加了'\',也可以说是对"回车"的转义,表示这里有一个回车字符而已,#define并没有结束.而程序编译的时候,编译器会忽略掉这些'\回车'的字符.
这样你就可以用 do_somethin() 来执行一系列操作.但这样会有个问题: 如果你下面这样用这个宏地话:if (...)do_something();当宏被展开后就变成:if (...)do_a();do_b();发现问题没? 原代码的目的是想在 if 为真的时候执行 do_a() 和 do_b(), 但现在呢? 只有 do_a() 在条件语句中, do_b() 任何时候都会执行的.这时你可能会将那个宏改进一下:#define do_something() { \do_a(); \do_b(); \}看样子行了, 是吗? 如果我这个宏是这个样子的呢:#define do_something() { \if (a) \do_a(); \else \do_b();}这么使用:if (...) do_something();else { ...}宏展开后:if (...){if (a)do_a();elsedo_b();}; else {}注意到第二个 else 前边那个分号了吗?所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉.综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用.注: 如果你看过 linux 内核源代码, 这个技巧非常常见
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值