23

我正在浏览一些C源代码,但我不明白以下部分

#if 1

   typedef unsigned short PronId;
   typedef unsigned short LMId;
#  define LM_NGRAM_INT

#else

   typedef unsigned int LMId;
   typedef unsigned int PronId;
#  undef LM_NGRAM_INT

#endif

为什么会有人这样做#if 1?不是只有第一个块会被处理吗?

4

9 回答 9

27

是的.. 只有第一个块将被处理 --- 直到有人将 1 更改为 0。然后将编译另一个块。这是在测试不同算法时临时切换代码块的便捷方式。

于 2010-02-15T13:06:27.177 回答
18

这样人们就可以通过#if 1#if 0.

于 2010-02-15T13:06:39.723 回答
6

软件的基本属性之一是计算机程序修改成本低

这就是为什么某些代码的编写方式会使修改更容易。这就是为什么他们需要各种模式,比如“接口”或“代理”。

这就是为什么您有时会看到奇怪的结构,例如#if 1- #else- #endif,其唯一目的是通过少量努力轻松切换将要编译的代码部分:将 1 更改为 0。

于 2010-02-15T13:13:41.727 回答
5

当我需要测试不同的参数集时,我把它放在我的代码中。通常我的产品会使用与调试环境中不同的默认值,所以我将默认值放在#if 1 中,将调试默认值放在#else 中,并带有#warning 来警告我它是用调试构建的默认值。

于 2010-02-15T13:08:23.257 回答
4

用于试验各种代码路径。

于 2010-02-15T13:06:18.720 回答
3

这只是注释大段代码的另一种方式,因此,编辑器自动缩进不会破坏缩进(注释的代码块将缩进为文本,而不是代码)。

于 2010-04-11T12:52:04.413 回答
2

我实际上将它用作使代码折叠更容易的工具。如果我将一段代码包装在一个 中#if 1 ... #endif,我可以将它折叠到我的编辑器中。(有问题的代码非常宏大,不是我写的,所以更传统的方法使一大块代码变得可管理是行不通的。)

于 2013-07-31T14:59:46.073 回答
2

更清洁的方法可能是执行以下操作:

#if ALGO1

#else

#endif

但是,您必须在某处将 ALGO1 传递给编译器参数...例如在生成文件中,您需要添加 -DALGO1=1 (如果未提供 1,则假定为 1)。参考:http ://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

这是更多的工作......所以,通常,为了快速检查,使用#if 1。在某些情况下,也会被遗忘和遗忘:-)

于 2013-07-31T16:02:34.800 回答
1

这是#if true的另一种说法,它很可能是以前检查另一个符号然后重构为始终为 true 的代码的结果。

于 2010-02-15T13:06:51.183 回答