【问题标题】: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
  • 太糟糕了,标题重复检测器没有发现这个......

标签: c function while-loop c-preprocessor


【解决方案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 在此处阅读完整答案stackoverflow.com/a/154138/1488917
    • @Joe:不,因为分号。正如 AshRj 所说,其他地方提供的答案是彻底的。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2016-05-03
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2016-08-22
      相关资源
      最近更新 更多