C 语言杂谈(三):do {...} while (0) 的作用

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) 来包围执行逻辑,因为它能确保宏的行为总是相同的,而不管在调用代码中使用了多少分号和大括号。

注:直接用大括号直接把宏包围起来可能会导致语法错误

猜你喜欢

转载自blog.csdn.net/zztiger123/article/details/106788342