为什么`做{...;出口(...);在C中的while(0)`

时间:2013-03-21 14:33:14

标签: c function while-loop c-preprocessor

作为C新手,我无法理解the following code

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                           } while (0)

我收集到这个函数为#define d的原因是覆盖现有函数,但是{em}无条件 {{1}的do ... while(0)循环的重点是什么声明?如果没有循环结构,是不是可以写这个?

3 个答案:

答案 0 :(得分:8)

我认为这里有很多重复。

do...while(0)技巧使您可以在各种情况下使用errExit而不会破坏任何内容:

if(x) errExit(msg);
else return 1;

被翻译为:

if(x) do { ...; ...; } while(0);
else return 1;

如果省略do...while(0)部分,则无法可靠地添加分号。

答案 1 :(得分:2)

假设宏没有do { ... } while(0)循环,只有里面的2个语句。现在,如果我要写

怎么办?
if( foo() )
    errExit("foo!" );

我的有条件退出已成为无条件退出。

答案 2 :(得分:1)

对于多个语句的宏函数,do { ... } while(0)构造是常见的,通常被认为是最佳实践,例如。它允许用作单个语句,因此没有任何意外。