首先,我知道what exactly does an if 0 endif block do?。
但我正在寻找FreeBSD的cat.c,而另一个问题的解释并没有解释这个文件中的#if 0
。注释掉的块比人们可以轻易删除的块小,但是他/她选择将它们包裹在#if 0 ... #endif
中。为什么有人会做出这样的选择而不是简单地删除这些代码?如果它以某种方式用作元数据,为什么不把它放在一些评论中呢?
答案 0 :(得分:4)
在这种情况下,它保存源代码中源最初派生的代码版本的历史记录(因此,即使您无法访问版本控制系统,也可以看到此信息),而不是正确地为编译器提供信息。
#if 0
#ifndef lint
static char const copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#endif
曾几何时,该信息将被编译成二进制文件。现代编译器消除了那些未使用的变量。
答案 1 :(得分:2)
#if 0
而不是注释掉代码。有一天而不是0
,他们可以使用环境变量来有选择地启用/禁用该功能。
答案 2 :(得分:0)
有时候我们确实想暂时禁用一段代码而不丢弃它。这可能有很多原因。
也许它正在开发中,所以我们真的不希望人们使用它,但我们不想为该开发维护单独的代码副本而不是发布。
或许这是一个想法,我们尝试了不起作用,但我们想要保持,而我们弄清楚它为什么不起作用。
或许它是我们考虑过的几种替代方案中的一种,我们尚未在它们中做出最终决定 - 在这种情况下,您会看到像#if 0 ... #else ... #endif
我们可以注释掉我们想要禁用的代码,但是在C99之前的C没有C ++所做的// comment-until-end-of-line语法,并且这使得注释掉了一个带有注释痛苦的块最好。虽然通过滥用注释可以在替代代码块之间来回切换,但它最好是丑陋的,并且对于具有类似C的预处理器的语言来说不是正确的答案。
(添加//注释是件好事,但我们很多旧的C编码器都不使用它们,但它们仍然没有解决在测试新解决方案时轻松切换备选方案的愿望。)< / p>
我们可以使用#ifdef
。但有人可能会认为这是一个建议,他们可以尝试打开它,并在它爆炸时抱怨。 #if 0
清楚地说“不要使用它。”
我同意#if 0
很难看。不幸的是,它也很有用,并且是一种相当常见的习语。绝对没有要求你使用它,但你应该习惯看到它,因为其他人会这样做。