为什么使用#if 0进行块注释?

Jas*_*ick 28 c compilation c-preprocessor

反向工程代码,我对这种风格感到震惊,但我想确保没有充分理由做这些事情....

它只是我还是一种可怕的编码风格

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);
Run Code Online (Sandbox Code Playgroud)

为什么包装代码不打算用于编译

#if 0
....
#endif
Run Code Online (Sandbox Code Playgroud)

而不是评论?


编辑:正如下面的一些解释,这是由于flummox/**/的可能性,我没有意识到.

但我仍然不明白,为什么不使用你的编程环境工具或喜欢的文本编辑器的宏来阻止使用"//"注释掉它

难道这不会更直接,更容易知道在视觉上跳过?


我只是缺乏C经验并且错过了为什么这些东西可能是一个好主意 - 或者没有任何借口,我有理由对这段代码的丑陋感到恼火?

jke*_*ian 36

#if 0 当删除的块包含块注释时,会经常使用它

我不会说这是一个很好的做法,但我经常看到它.

单行流控制+语句很容易理解,虽然我个人避免它(并且我工作的大多数编码指南都禁止它)

顺便说一句,我可能会编辑标题有点用"为什么使用#if 0而不是块注释"

如果您有以下内容

#if 0
        silly();
        if(foo)
           bar();
        /* baz is a flumuxiation */
        baz = fib+3;
#endif
Run Code Online (Sandbox Code Playgroud)

如果你天真地替换#if 0/ #endifwith /* */,那将导致注释在flumuxiation之后立即结束,当你点击上面*/的位置时会导致语法错误#endif.

编辑:最后一点,通常#if 0语法只是在开发时使用,特别是如果你必须支持多个版本或依赖项或硬件平台.将代码修改为并不罕见

#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
    much_code();
#endif
Run Code Online (Sandbox Code Playgroud)

使用集中标头定义(或不​​定义)数百个#define常量.这不是在世界上最漂亮的事情,但每次我上一个中型项目的工作时间,我们使用运行时开关的某种组合,编译时间常数(本),编译时编译的决定(只是用不同的. cpp取决于版本),以及偶尔的模板解决方案.这一切都取决于细节.

当你刚刚起步的东西摆在首位的工作,开发商虽然... #if 0是很常见的,如果你不知道,如果旧的代码仍然具有价值.

  • @Jason您不能使用/**/注释掉其他/**/,它们不会嵌套. (8认同)
  • 一个体面的编辑器也会使#if 0的代码变灰,所以这不是一个问题.使用示例进行编辑. (3认同)
  • @Jasaon:因为`/**/`注释不嵌套.因此,如果你使用它们来隐藏本身包含注释的代码,那么(外部)注释将以第一个`*/`结束. (3认同)
  • 正如jkerian指出的那样,如果您注释掉的代码已经有一个块引号,那么添加另一组块引号将不起作用。使用#if 0是更好的方法。 (2认同)

Jef*_*ege 19

评论是评论.他们描述了代码.

从编译中排除的代码是代码,而不是注释.它通常会包含注释,用于描述当前未编译的代码/

它们是两个截然不同的概念,强制使用相同的语法会让我觉得是一个错误.

  • +1这是一个很好的合理化.你总是*使用预处理器来排除代码.当然它有点难看,但死代码*应该是丑陋的,对吗? (3认同)

bta*_*bta 6

除了C样式注释不嵌套的问题之外,#if 0如果使用支持代码折叠的编辑器,则禁用代码块具有可折叠的优点.在任何编辑器中也很容易做到,而在没有编辑器支持/宏的情况下,用C++风格的注释禁用大块代码会很笨重.

此外,许多#if 0街区也有一个else街区.这提供了一种在两个实现/算法之间交换的简单方法,并且可以说比批量注释掉一个部分并且大量注释另一个部分更不容易出错.但是,你最好使用像#if DEBUG那个事件那样更具可读性的东西.