6

作为 C 新手,我无法理解以下代码

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

我收集到这个函数是#defined 的原因是要覆盖现有函数,但是do ... while(0)带有无条件 exit()语句的循环有什么意义呢?没有循环结构就不可能写这个吗?

4

3 回答 3

8

我认为这里有很多重复项。

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

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

被翻译成:

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

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

于 2013-03-21T14:35:55.107 回答
2

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

if( foo() )
    errExit("foo!" );

我的有条件退出变成了无条件退出。

于 2013-03-21T14:35:21.707 回答
1

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

于 2013-03-21T14:36:19.093 回答