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

l0b*_*0b0 5 c function while-loop c-preprocessor

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

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                           } while (0)
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*oit 8

我想在这里有很多重复.

这个do...while(0)技巧使您可以errExit在各种环境中使用而不会破坏任何东西:

if(x) errExit(msg);
else return 1;
Run Code Online (Sandbox Code Playgroud)

被翻译成:

if(x) do { ...; ...; } while(0);
else return 1;
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么普通的旧牙套不能完成这项工作? (2认同)

Pra*_*ian 2

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

if( foo() )
    errExit("foo!" );
Run Code Online (Sandbox Code Playgroud)

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