在 C/C + +
放置在 #if 0/#endif块之间的代码会发生什么情况?
#if 0
#endif
#if 0 //Code goes here #endif
是否只是跳过代码而不执行代码?
它会永久地注释掉那段代码,这样编译器就永远不会编译它了。
如果编码人员愿意,他可以稍后更改 # ifdef,以便在程序中编译该代码。
就好像密码不存在一样。
它不仅没有被执行,甚至没有被编译。
#if是一个预处理器命令,它在实际编译步骤之前进行计算。该块中的代码不会出现在已编译的二进制文件中。
#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之后的 */出现语法错误。另一方面:
*/
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块不会到达编译器,也不会生成任何机器代码。
#
#if 0 [...] #endif
您可以使用源文件 ifdef.cxx演示使用预处理器会发生什么:
ifdef.cxx
#if 0 This code will not be compiled #else int i = 0; #endif
运行 gcc -E ifdef.cxx将显示编译的内容。
gcc -E ifdef.cxx
您可以选择使用这种机制来防止在开发周期中编译代码块,但是您可能不希望将它签入到源代码控制中,因为它只会给代码增加麻烦并降低可读性。如果它是一段已经被注释掉的历史代码,那么它应该被删除: 源代码控制包含历史,对吗?
此外,对于 C和 C + + ,答案可能是相同的,但是没有称为 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的情况:
#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