cat.c中#if 0的目的

时间:2014-03-11 02:55:41

标签: c c-preprocessor freebsd cat

首先,我知道what exactly does an if 0 endif block do?

但我正在寻找FreeBSD的cat.c,而另一个问题的解释并没有解释这个文件中的#if 0。注释掉的块比人们可以轻易删除的块小,但是他/她选择将它们包裹在#if 0 ... #endif中。为什么有人会做出这样的选择而不是简单地删除这些代码?如果它以某种方式用作元数据,为什么不把它放在一些评论中呢?

3 个答案:

答案 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很难看。不幸的是,它也很有用,并且是一种相当常见的习语。绝对没有要求你使用它,但你应该习惯看到它,因为其他人会这样做。