如何保护自己不忘记包括我的"config.h"?

How to protect myself against forgetting to include my "config.h"?

本文关键字:我的 包括 config 忘记 何保护 保护 自己      更新时间:2023-10-16

我在我的项目中使用全局"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