【问题标题】:Can I set a compile time flag to include a header?我可以设置编译时标志以包含标头吗?
【发布时间】:2011-08-16 18:34:22
【问题描述】:

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

此类的单独版本保存在单独的子文件夹中。

例如。

  • main/config.h

  • main/config.cpp

  • secondary/config.h

  • secondary/config.cpp

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

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

【问题讨论】:

  • 不使用预编译器吗?
  • 您使用的是什么构建系统? Makefiles、cmake、vs、msbuild等
  • ...that I would like to use for a variety of builds. The class itself changes between builds...I would like to avoid having separate builds 这些似乎是矛盾的。你能解释一下吗?
  • 你能澄清一下乍得吗?我没有完全按照你的意思..
  • 目前使用 msbuild / devenv 构建系统

标签: c++ header compilation


【解决方案1】:

根据您使用的构建系统,您将创建一个指向主路径或辅助路径的变量。然后使用此变量附加到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

【讨论】:

    【解决方案2】:

    #include 指令并不真正关心内容。

    您可以轻松地在项目中使用存根类:

    存根.cpp

    #ifdef BUILD1
        #include "main/realimpl1.cpp"
    #else
        #include "secondary/realimpl2.cpp"
    #endif
    

    当然,如果需要,您可以对标题做同样的事情。

    【讨论】:

    • 很抱歉我之前并不清楚,如果可能的话,我试图避免在整个代码中分散 #ifdef 和 #define 值。
    • 这并不是真正的分散,在这个答案中,这些是仅有的五个,并且都在他们自己的文件中。
    【解决方案3】:

    你可以像这样放入你的 header/cpp 保护:

    #ifdef OPTION_A
    
    ...
    
    #endif
    

    【讨论】:

      【解决方案4】:

      你可以使用编译时的#define比如

      #define USE_BUILD_X 1
      //#define USE_BUILD_Y 1    
      ...
      ...
      #ifdef (USE_BUILD_X)
      #include "mainheader.h"
      #elif (USE_BUILD_Y)
      #include "secondheader.h"
      #endif
      

      【讨论】:

      • 我想避免这种情况,因为我有很多构建,并且 #ifdef / #elif / 等的集合...检查会难看且难以维护。
      • 你在使用构建系统吗?
      【解决方案5】:

      我想最好的选择是使用多个 makefile 或任何你使用的东西。每个配置一个。不要让你的源文件不可读。

      您可以将公共文件放在 Common 目录中,而将其他文件放在单独的目录中 - 每个配置一个目录。

      【讨论】:

        【解决方案6】:

        在 Visual Studio(如果那是您的 IDE)中,您可以有多个“配置”(默认为调试和发布),并且每个构建中可能不包含某些文件。您可以将配置“Debug main”排除在辅助/config.cpp 之外,并将配置“Debug second”排除在 main/config.cpp 之外。 如果您不使用 Visual Studio,我相信有一种方法可以对 make 文件执行类似的操作。

        【讨论】:

          【解决方案7】:

          只需将相关目录添加到编译器的包含路径前面即可。

          您可以通过一些编译器选项更改编译器的包含路径(这取决于编译器)。

          对于 .cpp 文件也是如此。只需在您的普通源代码树中创建一个 .cpp 文件,该文件通过 #include 指令包含该 .cpp 文件。

          干杯,

          【讨论】:

            猜你喜欢
            • 2019-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-12
            • 2018-03-13
            • 1970-01-01
            • 2021-11-24
            相关资源
            最近更新 更多