我正在浏览一些 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
?难道只有第一个块会被处理吗?
答案 0 :(得分:20)
是..只处理第一个块---直到有人将1更改为0.然后将编译另一个块。这是在测试不同算法时临时切换代码块的便捷方式。
答案 1 :(得分:17)
通过将#if 1
更改为#if 0
,可以快速选择要编译的部分。
答案 2 :(得分:6)
软件的一个基本属性是计算机程序修改便宜。
这就是为什么某些代码的编写方式会使修改变得更容易。这就是他们需要各种模式的原因,比如“接口”或“代理”。
这就是为什么你有时会看到奇怪的结构,如#if 1
- #else
- #endif
,其唯一的目的是轻松切换将要编译的代码部分,通过小努力:将1改为0。
答案 3 :(得分:5)
当我需要测试不同的参数集时,我把它放在我的代码中。通常我的产品将提供与我在调试环境中可以使用的默认值不同的默认值,因此我将出货默认设置放在#if 1中,调试默认设置在#else中,带#warning警告我它是用调试构建的默认值。
答案 4 :(得分:4)
用于试验各种代码路径。
答案 5 :(得分:3)
这是注释掉大部分代码的另一种方式,因此,编辑器自动缩进不会破坏缩进(注释的代码块将缩进为文本,而不是代码)。
答案 6 :(得分:2)
我实际上使用它作为kludge,使代码折叠更容易;如果我在#if 1 ... #endif
中包含一段代码,我可以在我的编辑器中折叠它。 (有问题的代码非常庞大,而且不是由我编写的,因此更加传统的方法可以使大量代码块易于管理。)
答案 7 :(得分:1)
这是另一种说法 #if true ,这很可能是以前检查另一个符号然后重构为始终为真的代码的结果。
答案 8 :(得分:1)
更干净的做法可能就是:
#if ALGO1
#else
#endif
但是,你必须将ALGO1传递给编译器args某处...例如在makefile中,你需要添加-DALGO1 = 1(如果没有提供1,则假定为1)。参考:http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html
这是更多工作......因此,通常,为了快速检查,使用#if 1。在某些情况下,也被遗忘并留下: - )