为啥`做 ...;出口(...); C 语言中的 while (0)`? [复制]

Posted

技术标签:

【中文标题】为啥`做 ...;出口(...); C 语言中的 while (0)`? [复制]【英文标题】:Why `do ...; exit(...); while (0)` in C? [duplicate]为什么`做 ...;出口(...); C 语言中的 while (0)`? [复制] 【发布时间】:2013-03-11 03:10:38 【问题描述】:

作为一个 C 新手,我很难理解 the following code:

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

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

【问题讨论】:

好问题,我也有同样的疑惑! +1 太糟糕了,标题重复检测器没有发现这个...... 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

我认为这里有很多重复。

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

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

翻译成:

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

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

【讨论】:

为什么普通的旧牙套不起作用? 不错! +1。这真的很聪明也很棘手。 啊,所以整个想法是将生成的代码保留为从周围代码中看到的单个语句?整洁! @Joe 在此处阅读完整答案***.com/a/154138/1488917 @Joe:不,因为分号。正如 AshRj 所说,其他地方提供的答案是彻底的。【参考方案3】:

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

【讨论】:

以上是关于为啥`做 ...;出口(...); C 语言中的 while (0)`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的任何类型数据都可进行四则运算吗?为啥?

关于C语言宏定义,这样为啥不行

C语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?

急求c语言 dev c++) 利用结构体做一个小系统,为啥直接无法编译运行?

请教您fluent中UDF编译压力随速度变化

讲一下c语言中递归函数的使用方法有哪些?