问题笔记-宏定义为什么加do while (0)

问题:为什么写成do while (0)格式,这不是等价于直接单次执行语句么

代码中包含

#define EXEC_WITH_HINT(label, code_stmt, code_str) \
    do { code_stmt; g_codeHintManager.AddHint(label, code_str); } while (0)

为什么不写成:

#define EXEC_WITH_HINT(label, code_stmt, code_str) \
    { code_stmt; g_codeHintManager.AddHint(label, code_str); } 

让宏在各种上下文中表现得像一个“完整的语句”,尤其是在 if / else 等控制流中不会出错。

虽然表面看起来只是包装了一下代码块并加个假的循环,但:

do { … } while(0) 是一种 为了保证宏使用安全、语法一致性 的 最佳实践,特别是在你希望宏表现得像一个函数或普通语句的时候。

这并不等价于“直接执行语句” —— 它是为了避免宏在某些语法结构下造成解析错误。

注意事项

  • do { ... } while(0) 会在预处理后变成普通语句块,不会重复执行。
  • 如果宏内部有局部变量定义,也建议用这种方式包装。
  • 写在宏外部时,宏调用者可以放心地写:

举个例子对比:

没有 do {} 的宏:

#define BAD_MACRO(x)  code1; code2;

if (condition)
    BAD_MACRO(123);
else
    do_something_else();

实际上会变成:

if (condition)
    code1;
code2; // ❌ 语法错误
else
    do_something_else(); 


使用 do {} while (0) 的宏:

#define GOOD_MACRO(x)  do { code1; code2; } while (0)

if (condition)
    GOOD_MACRO(123);
else
    do_something_else();

变成:

if (condition)
    do { code1; code2; } while (0); // ✅ 正确
else
    do_something_else(); 

do { … } while (0) 相当于一个不会重复执行的块语句,末尾有分号,控制结构上安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值