如何保护自己不要忘记包含我的“config.h”?

时间:2011-11-15 16:28:55

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

我在项目中使用全局“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文件中被视为已禁用,而它被视为在其余源文件中启用。

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

在源文件中插入以下#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 :(得分:1)

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

SCNR

答案 3 :(得分:0)

您只需使用#ifndef测试定义。

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

答案 4 :(得分:0)

使用二元性表达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