#if 0 ..... #endif块到底是做什么用的?

vet*_*982 115 c-preprocessor

C/C++中

#if 0/ #endifblock 之间放置代码会发生什么?

#if 0

//Code goes here

#endif
Run Code Online (Sandbox Code Playgroud)

代码是否只是被跳过,因此无法执行?

Dav*_*vid 133

它不仅没有被执行,甚至没有被编译.

#if是一个预处理器命令,在实际编译步骤之前进行评估.该块中的代码不会出现在已编译的二进制文件中.

它通常用于临时删除代码段,以便以后再打开它们.

  • 任何类型的评论都是如此。重要的区别是嵌套。 (2认同)

Tyl*_*nry 69

除了一个重要的区别外,它与注释掉块是完全相同的:嵌套不是问题.考虑以下代码:

foo();
bar(x, y); /* x must not be NULL */
baz();
Run Code Online (Sandbox Code Playgroud)

如果我想发表评论,我可能会尝试:

/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Run Code Online (Sandbox Code Playgroud)

Bzzt.语法错误!为什么?由于块注释不嵌套,所以(你可以从SO的语法高亮看到)的*/单词"NULL"结束后的评论,使得baz没有被注释掉的呼叫,并在*/baz一个语法错误.另一方面:

#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Run Code Online (Sandbox Code Playgroud)

努力评论整个事情.而#if 0意志巢对方,就像这样:

#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Run Code Online (Sandbox Code Playgroud)

虽然如果没有正确评论,这当然会让人感到有些困惑,并且会成为一种维护问题.

  • 请注意,#if中的代码必须是词法正确的(而不是注释),并且预处理程序指令仍然有效(同上). (4认同)

Nil*_*ert 17

它会永久注释掉该代码,因此编译器永远不会编译它.

编码器可以稍后更改#ifdef,以便在程序中编译该代码,如果他愿意的话.

这就像代码不存在一样.


Jör*_*tag 13

#if 0 ... #endif块到底是做什么用的?

它告诉你,作者显然从未听说过版本控制系统.反过来,这会告诉你尽可能地跑...


Ste*_* Xu 12

我想补充一下这个#else案子:

#if 0
   /* Code here will NOT be complied. */
#else
   /* Code will be compiled. */
#endif


#if 1
   /* Code will be complied. */
#else
   /* Code will NOT be compiled. */
#endif
Run Code Online (Sandbox Code Playgroud)


Ste*_*owe 6

当预处理器看到#if时,它检查下一个标记是否具有非零值.如果是这样,它会保留编译器的代码.如果没有,它将摆脱该代码,因此编译器永远不会看到它.

如果有人说#if 0他们正在有效地评论代码,那么它将永远不会被编译.你可以把它想象成就像放在它周围的/*...*/一样.它不完全相同,但它具有相同的效果.

如果你想了解详细情况,你可以经常看.许多编译器将允许您在预处理器运行后查看文件.例如,在Visual C++上,switch/P命令将执行预处理器并将结果放在.i文件中.