【问题标题】:Why would somebody use an #if 1 C preprocessor directive?为什么有人会使用#if 1 C 预处理器指令?
【发布时间】:2011-01-16 23:41:54
【问题描述】:

我正在浏览一些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?不是只有第一个块会被处理吗?

【问题讨论】:

  • @Thomas 不,它是语音识别应用程序中发音 id 的缩写

标签: c-preprocessor preprocessor-directive


【解决方案1】:

用于试验各种代码路径。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这样就可以通过将#if 1更改为#if 0来快速选择要编译的部分。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            这就是为什么你有时会看到像#if 1-#else-#endif 这样的奇怪结构,其唯一目的是轻松切换将要编译的代码部分,只需一点点努力:将 1 更改为 0 .

            【讨论】:

            • 我喜欢这句话:Computer program is cheap to modify
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                更简洁的做法可能是:

                #if ALGO1
                
                #else
                
                #endif
                

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

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

                【讨论】:

                  猜你喜欢
                  • 2011-01-16
                  • 2012-06-08
                  • 1970-01-01
                  • 2016-11-18
                  • 1970-01-01
                  • 2010-12-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多