C 语言中可以使用 do {...} while (0)
进行 #define 多语句宏定义操作,使用 do{...} while(0)
构造后的宏定义不会受到大括号、分号等的影响,总是会按你期望的方式调用运行。以下是示例:
1. do {...} while (0)
使用示例
首先定义一个多语句宏:
#define foo(x) bar(x); baz(x)
然后对比以下三种调用方式。
1.1 通过 foo(wolf)
调用宏
调用宏:
foo(wolf);
宏扩展后:
bar(wolf); baz(wolf);
在这种情况下确实是期望的输出结果。
1.2 通过 if
调用宏
调用宏:
if (!feral)
foo(wolf);
宏扩展后:
if (!feral)
bar(wolf);
baz(wolf);
在这种情况下显而易见就不是期望的结果了,所以我们需要采取第三种调用方式。
1.3 通过 do{...}while(0)
调用宏
调用宏:
if (!feral)
do {
bar(wolf); baz(wolf); } while (0);
宏扩展后可以等价为以下:
if (!feral) {
bar(wolf);
baz(wolf);
}
do
能确保大括号里的逻辑能被执行,而 while(0)
能确保该逻辑只被执行一次,即与没有循环时一样。Linux 和其它代码库里的宏都用do/while(0)
来包围执行逻辑,因为它能确保宏的行为总是相同的,而不管在调用代码中使用了多少分号和大括号。
注:直接用大括号直接把宏包围起来可能会导致语法错误