C language syntax: if { ... } while(0);

3

1
代码写得非常糟糕且混乱。从头文件开始:ping.h包含了一些#includes、结构定义和inline static函数的混合体。此外,Github上的代码永远不会编译。存在许多问题,包括代码中对print_timestamp();的调用,但原型是:extern void print_timestamp(struct ping_rts *rts);请注意:此原型在代码中出现了4次。建议要么计划大量修复代码,要么寻找另一个项目。 - user3629249
我对你引用的代码有两个理论。首先,它看起来很像是从一个复杂的宏中剥离出来的代码;通常它们使用 do{...}while(0) 实现,以便像函数一样使用而不会立即导致行终止。另一个理论是它是一个混淆金丝雀:这些是弱(通常是无用的)习惯用语,偶尔散布在周围,可以帮助确定是否有人窃取了开源实现(也就是违反了代码的 OSS 许可证)。 - jhill515
2个回答

7

这是两个连续的语句。与此完全等效。

if(/* ... */) {
  // Body
}
while(0) {
  // empty
}

while(0);只是一个循环,具有单个空语句作为主体。

if之后添加它没有任何意义。我怀疑这是从先前的重构中剩下来的,但该存储库中的git历史记录不那么详细。


4
  1. It compiles because it is two statements, first

    if (...) { ... }
    

    followed by another statement

    while (0);
    

    i.e. a loop with empty body that is never run.

  2. There is no value. while (0); as a separate statement is utterly useless. do { ... } while (0) is not useless but it is a completely different thing.

可能这段代码是通过重构而来的,最初使用了do { ... } while (0)和利用break提前跳出流程(参考上述问题链接)。目前源文件中没有任何do语句的实例,只有在某些字符串中存在3次动词do

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接