我在项目中使用全局“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文件中被视为已禁用,而它被视为在其余源文件中启用。
有时即使在运行时,后果也不会立即显现出来。
答案 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