c++ - 我可以设置编译时标志以包含标题吗?

标签 c++ header compilation

我有一个配置类,我想将其用于各种构建。类本身在构建之间发生变化,但类名保持不变,头文件名也是如此。

此类的不同版本保存在不同的子文件夹中。

例如。

  • main/config.h

  • main/config.cpp

  • secondary/config.h

  • secondary/config.cpp

是否有一种好方法可以通过编译时标志或命令行选项让构建确定要使用的 header /cpp?我已经有很多配置,并希望将来有更多配置。我想避免一长串#ifdef/#elif/#elif/etc..

编辑:我想避免单独构建,并想避免在整个代码中使用#defines。如果我之前没有说清楚,我很抱歉! >_<

最佳答案

根据您使用的构建系统,您将创建一个指向主路径或辅助路径的变量。然后使用此变量附加到 INCLUDE 路径,以便您的所有源在需要访问配置时只需 #include "config.h" 即可。在您的 Makefile(或等效文件)中,您需要将 $CONFIGPATH/config.cpp 添加到要构建的源中。

MSBuild

更新源文件路径:

<ItemGroup>
    <ClCompile Include="main.cpp" />
    <ClCompile Include="$(ConfigToUse)/config.cpp" />
</ItemGroup>
<ItemGroup>
     <ClInclude Include="$(ConfigToUse)/config.h" />
</ItemGroup>

包含路径:

<PropertyGroup>
    <ConfigurationType>Application</ConfigurationType>
    <ShowAllFiles>false</ShowAllFiles>
    <IncludePath>...;$(ConfigToUse);</IncludePath>
</PropertyGroup>

然后调用msbuild build.xml/p:ConfigToUse=PathToConfig

关于c++ - 我可以设置编译时标志以包含标题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083205/

相关文章:

c# - 从 BackgroundWorker C# 调用的 CoInitialize

function - 为什么 Golang 允许两个函数在具有不同的接收者类型时具有相同的名称,但在它们具有不同的参数类型时则不允许?

C++ 异步任务。包含 "Future"麻烦

ios - 自定义 header "fatal error: unexpectedly found nil while unwrapping an Optional value"

generics - 如何在rust宏中扩展多个特征范围?

fonts - 带有 icomoon 的 webpack 不起作用

c++ - 如何在多个 .cpp 文件中使用全局变量?

c++ - 不同类的链表,如何用指针访问具体的类函数?

c++ - 有没有办法映射与 Boost 一起使用的网络驱动器(带凭据)?

header - ELF 程序头段大小和偏移量