【发布时间】:2022-01-08 00:18:55
【问题描述】:
我正在使用 Microsoft Visual Studio 2017,并使用 C++ 编写代码。
头文件中的#define 设置总是存在一个问题。第一种方法是将设置放在与特定源文件对应的多个头文件中。这种方法对于最小化重建是可以的,但主要缺点是设置存储在多个文件中。
另一种方法是将所有定义存储在一个config.h 文件中,并将其包含到所有源文件中。配置起来要容易得多,但每次更改设置时都会重新编译包括config.h 在内的所有文件。
所以我决定使用第三种方法。所有设置都存储在config.h(每个项目一个)中,并且在它们之前有一个特殊的注释行,其中包含确切头文件的相对路径,如下所示:
// in:core/net/http.h
// some http setting
#define CFG_SOME_HTTP_OPTION
// in:core/net/dns.h
// some dns setting
#define CFG_SOME_DNS_OPTION
但是config.h 本身不包含在任何源文件中。相反,它由预构建脚本解析,该脚本构建一个代码,其中包含config.h 中提到的每个头文件的所有定义。然后检查此代码是否与特定标头中已经显示的代码不同,并且仅当代码不同时才进行替换。这种方法保留了前两种方法的优点,因为所有设置仍然在一个头文件中,但只有那些设置被更改的文件才会被重建。
我写了这个脚本,除了一件事之外,一切都很完美。 config.h 是项目的一部分,但不包含在任何源文件中。这就是为什么 Visual Studio 甚至不运行我的预构建脚本因为最新的检查:如果仅在 config.h 中进行更改,它仍然认为该项目是最新的。
我该如何解决这个问题?最简单的方法是为每个项目创建包含config.h的特殊源文件,但是如果只修改config.h,也许还有另一种方法可以强制构建过程?
【问题讨论】:
标签: c++ visual-studio build