如何保护自己不忘记包括我的"config.h"?
How to protect myself against forgetting to include my "config.h"?
我在我的项目中使用全局"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文件中被视为禁用,而在其他源文件中被视为启用。
有时结果甚至在运行时也没有立即明显。
在源文件中插入以下#if
#if !defined(ENABLE_FEATURE1) && !defined(ENABLE_FEATURE2)
#error "Please include <config.h>"
#endif
那么,您可能会遇到另一个问题:如果我忘记插入上面的#ifdef
怎么办?:)
在这种情况下,你可以包括config.h
在一个预编译头(例如,stdafx.h
)和打开使用预编译头。如果一个文件不包含stdafx.h
, MSVC将抛出一个错误。
最后,您可以编写一个简单的脚本来检查是否每个源代码都有config.h
这不是最好的方法,也不是最优的方法,但肯定是最简单的方法。
在config.h
中添加一个虚拟变量的声明,并访问需要包含config.h
的cpp文件中的变量。
使用一些文本搜索器来爬行您的文件。如果你没有包含它,触发一个usb端口触发这个:link:)
SCNR
您可以简单地使用#ifndef
测试定义。
#ifndef ENABLE_FEATURE1
#error "someshizzle"
#endif
#if ENABLE_FEATURE1
// do something
#endif
用二元性表示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
相关文章:
- 如何反转我的输入,包括否定
- 包括没有完整路径的我的库
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- 在我的项目中包括eigen将标准INT定义为eigen :: denseIndex-如何使用正常INT
- C //尝试重写一个工作代码以包括我的功能
- 我应该包括外部库的src代码还是从外部库构建的静态库
- 创建一个动态数组,包括汽车的年份和品牌,但无法保存我的第一个输出
- 我的C程序如何可以从C 文件调用函数,而无需包括标头
- 我包括Ws2tcpip.h,但我的编译器说inet_ntop是未声明的
- 试图包括我的源文件的问题
- 我的VS2013应用程序应该包括哪个C++合并模块
- 提升单元测试框架:包括我的代码库的主要功能
- 在我的项目中包括ini文件
- 如何保护自己不忘记包括我的"config.h"?
- 我如何在我的Qt项目文件中包括Boost
- 我如何包括一个.cpp/.h文件对在qnx的时刻
- 为什么我的类是不可访问的,而我已经包括了头文件
- 我怎么能包括调试信息在我的二进制文件
- 包括一个头在预编译头和它外面在我的类头文件
- 试图让我的游戏在VC 2010中运行,似乎无法链接SOIL库,不知道如何链接,包括游戏源代码