【问题标题】:How to protect myself against forgetting to include my "config.h"?如何保护自己不要忘记包含我的“config.h”?
【发布时间】:2011-11-15 16:28:55
【问题描述】:

我在我的项目中使用全局“config.h”来定义启用/禁用功能的各种标志。我使用约定定义:

#define ENABLE_FEATURE1    0 // feature is disabled
#define ENABLE_FEATURE2    1 // feature is enabled

然后在我为它们测试的源文件中:

#if ENABLE_FEATURE1
  // do something
#endif
#if ENABLE_FEATURE2
  // do something
#endif

但是,有几次我忘记在测试这些标志的 cpp 文件中包含“config.h”。然后我没有收到来自预处理器的错误或警告,程序构建良好,但编译器将所有未定义的标志视为设置为零,因此该功能在该 cpp 文件中被视为禁用,而它被视为在其余的源文件中启用。

有时即使在运行时后果也不会立即显现出来。

【问题讨论】:

    标签: c++ visual-studio c-preprocessor


    【解决方案1】:

    在源文件中插入以下#if

    #if !defined(ENABLE_FEATURE1) && !defined(ENABLE_FEATURE2)
    #error "Please include <config.h>"
    #endif
    

    那么,你可能还有一个问题:如果我忘记插入上面的#ifdef怎么办? :)

    在这种情况下,您可以在预编译头文件中包含config.h(例如stdafx.h)并启用使用预编译头文件。如果文件不包含stdafx.h,MSVC 将引发错误。

    最后,你可以编写一个简单的脚本来检查每个源代码是否有config.h

    【讨论】:

      【解决方案2】:

      这不是最好的也不是最优化的方法,但肯定是最简单的。
      config.h 中添加一个虚拟变量的声明,并在需要包含config.h 的cpp 文件中访问该变量。
      如果不包含标头,则会出现编译错误。

      【讨论】:

        【解决方案3】:

        使用一些文本搜索器来抓取您的文件。如果您没有包含它,请触发一个触发此功能的 USB 端口:link :)

        信噪比

        【讨论】:

          【解决方案4】:

          您可以使用#ifndef 简单地测试定义。

          #ifndef ENABLE_FEATURE1
              #error "someshizzle"
          #endif
          #if ENABLE_FEATURE1
             // do something
          #endif
          

          【讨论】:

            【解决方案5】:

            用对偶性公式化 config.h:

            #define ENABLE_FEATURE1 1
            #define DISABLE_FEATURE1 !ENABLE_FEATURE1
            

            然后使用 elif 子句:

            #ifdef ENABLE_FEATURE1
            [...enabled code...]
            #elif DISABLE_FEATURE1
            [...disabled code...]
            #else
            #error "config.h is not included"
            #endif
            

            【讨论】:

              猜你喜欢
              • 2017-03-14
              • 1970-01-01
              • 2019-10-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-10
              • 1970-01-01
              相关资源
              最近更新 更多