在C / C ++中
在#if 0
/ #endif
块之间放置的代码会怎样?
#if 0
//Code goes here
#endif
代码是否只是被跳过而没有被执行?
在C / C ++中
在#if 0
/ #endif
块之间放置的代码会怎样?
#if 0
//Code goes here
#endif
代码是否只是被跳过而没有被执行?
Answers:
它不仅不被执行,甚至不被编译。
#if
是一个预处理程序命令,在实际编译步骤之前会对其进行评估。该块内的代码不会出现在已编译的二进制文件中。
它通常用于临时删除代码段,以便稍后将其重新打开。
除了注释之间的一个重要区别外,这与注释掉该块相同:嵌套不是问题。考虑以下代码:
foo();
bar(x, y); /* x must not be NULL */
baz();
如果要注释掉,可以尝试:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
zz 语法错误!为什么?由于块注释不嵌套,所以(你可以从SO的语法高亮看到)的*/
单词“NULL”结束后的评论,使得baz
没有被注释掉的呼叫,并在*/
后baz
一个语法错误。另一方面:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
注释掉整个事情。并且#if 0
s将彼此嵌套,如下所示:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
当然,如果不正确地进行注释,这可能会造成一些混乱,并给维护带来麻烦。
foo.c:3: unterminated string or character constant
来自gcc,您在使用什么?
当预处理器看到#if时,它将检查下一个令牌是否具有非零值。如果是这样,它将为编译器保留代码。如果没有,它将删除该代码,因此编译器将永远不会看到它。
如果有人说#if 0,那么他们正在有效地注释掉代码,因此它将永远不会被编译。您可以认为这就像他们将/ * ... * /放在它周围一样。它并不完全相同,但是效果相同。
如果您想详细了解发生了什么,可以经常看一下。在预处理程序运行之后,许多编译器将允许您查看文件。例如,在Visual C ++上,switch / P命令将执行预处理器并将结果放入.i文件中。
#if WIN32 || __CYGWIN__
但这确实可以预期。
以a开头的行#
是预处理程序指令。 #if 0 [...] #endif
块不会传递给编译器,并且不会生成任何机器代码。
您可以通过源文件演示预处理器的情况ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
运行gcc -E ifdef.cxx
将向您显示编译的内容。
您可以选择使用这种机制来防止在开发周期中编译代码块,但是您可能不希望将其检入到源代码管理中,因为这只会增加代码的混乱性并降低可读性。如果这是一段已被注释掉的历史代码,则应将其删除:源代码控件包含历史记录,对吗?
同样,对于C和C ++,答案可能是相同的,但是没有称为C / C ++的语言,并且不是引用这种语言的好习惯。
不完全的
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
它在gcc 4.2.4中显示“ tc:4:19:警告:缺少终止'字符”
//
或者在开头部分,/*
然后在结尾部分*/
。后一种技术的问题在于注释不会嵌套,因此开发人员必须检查和处理*/
开始和结束之间的任何内容。