# if 0... # endf 块具体做什么?

C/C + +

放置在 #if 0/#endif块之间的代码会发生什么情况?

#if 0


//Code goes here


#endif

是否只是跳过代码而不执行代码?

121663 次浏览

它会永久地注释掉那段代码,这样编译器就永远不会编译它了。

如果编码人员愿意,他可以稍后更改 # ifdef,以便在程序中编译该代码。

就好像密码不存在一样。

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

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

它通常用于临时删除代码段,以便稍后重新打开它们。

它与注释掉块是一样的,除了一个重要的区别: 嵌套不是问题:

foo();
bar(x, y); /* x must not be NULL */
baz();

如果我想评论它,我可能会试试:

/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/

嗡。语法错误!为什么?因为块注释不嵌套,所以(正如你可以从 SO 的语法突显中看到的)“ NULL”之后的 */终止注释,使得 baz调用没有被注释掉,而 baz之后的 */出现语法错误。另一方面:

#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif

作品评论出整个事情。和 #if 0将嵌套彼此,像这样:

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

当然,如果没有正确地注释,这可能会让人感到有点困惑,并且成为维护工作中的一个头痛问题。

当预处理程序看到 # if 它检查下一个令牌是否有非零值时。如果是这样,它会为编译器保留代码。如果没有,它就会删除代码,这样编译器就永远看不到它了。

如果有人说 # If 0,他们实际上是在注释掉代码,因此它永远不会被编译。你可以这样想,就好像他们把/* ... */围绕着它。虽然不完全一样,但效果是一样的。

如果你想详细了解发生了什么,你可以经常看看。许多编译器允许您在预处理器运行后查看文件。例如,在 Visual C + + 上,switch/P 命令将执行预处理器并将结果放入。我申请了。

#开头的行是 预处理器指令预处理器指令#if 0 [...] #endif块不会到达编译器,也不会生成任何机器代码。

您可以使用源文件 ifdef.cxx演示使用预处理器会发生什么:

#if 0
This code will not be compiled
#else
int i = 0;
#endif

运行 gcc -E ifdef.cxx将显示编译的内容。

您可以选择使用这种机制来防止在开发周期中编译代码块,但是您可能不希望将它签入到源代码控制中,因为它只会给代码增加麻烦并降低可读性。如果它是一段已经被注释掉的历史代码,那么它应该被删除: 源代码控制包含历史,对吗?

此外,对于 CC + + ,答案可能是相同的,但是没有称为 C/C + + 的语言,而且引用这种语言不是一个好习惯。

不完全是

int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}

它显示“ t.c: 4:19: 警告: 丢失终止’字符” 与 gcc 4.2.4

这是一种廉价的注释方式,但我怀疑它可能具有调试潜力。例如,假设您有一个将值输出到文件的构建。您可能不希望在最终版本中出现这种情况,因此可以使用 # if 0... # endf。

另外,我认为为了调试的目的,更好的方法是这样做:

#ifdef DEBUG
// output to file
#endif

You can do something like that and it might make more sense and all you have to do is define DEBUG to see the results.

我想补充一下 #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