为啥`做 ...;出口(...); 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)
我收集到这个函数是#define
d 的原因是要覆盖现有函数,但是带有无条件 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语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?