在C/C++中
在#if 0/ #endifblock 之间放置代码会发生什么?
#if 0
//Code goes here
#endif
Run Code Online (Sandbox Code Playgroud)
代码是否只是被跳过,因此无法执行?
Dav*_*vid 133
它不仅没有被执行,甚至没有被编译.
#if是一个预处理器命令,在实际编译步骤之前进行评估.该块中的代码不会出现在已编译的二进制文件中.
它通常用于临时删除代码段,以便以后再打开它们.
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)
虽然如果没有正确评论,这当然会让人感到有些困惑,并且会成为一种维护问题.
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)
当预处理器看到#if时,它检查下一个标记是否具有非零值.如果是这样,它会保留编译器的代码.如果没有,它将摆脱该代码,因此编译器永远不会看到它.
如果有人说#if 0他们正在有效地评论代码,那么它将永远不会被编译.你可以把它想象成就像放在它周围的/*...*/一样.它不完全相同,但它具有相同的效果.
如果你想了解详细情况,你可以经常看.许多编译器将允许您在预处理器运行后查看文件.例如,在Visual C++上,switch/P命令将执行预处理器并将结果放在.i文件中.