我可以设置编译时标志来包含标题吗?

时间:2011-08-16 18:34:23

标签: c++ header compilation

我有一个配置类,我想用于各种构建。类本身在构建之间发生变化,但类名仍然与头文件名相同。

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

离。

  • 主/ config.h中

  • 主/ config.cpp

  • 次级/ config.h中

  • 次级/ config.cpp

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

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

7 个答案:

答案 0 :(得分:2)

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

您可以轻松拥有在项目中使用的存根类:

stub.cpp

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

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

答案 1 :(得分:2)

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

你可以像这样放入你的标题/ cpp守卫:

#ifdef OPTION_A

...

#endif

答案 3 :(得分:0)

您可以使用编译时#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

答案 4 :(得分:0)

我认为好的选择是使用几个makefile或任何你使用的。每个配置一个。不要让源文件不可读。

您可以将公共文件放在Common目录中,将其他文件放在不同的目录中 - 每个配置都有一个目录。

答案 5 :(得分:0)

在Visual Studio中(如果这是您的IDE),您可以拥有多个“配置”(默认情况下为Debug和Release),并且可以在每个构建中包含某些文件。你可以使配置“Debug main”排除secondary / config.cpp,配置“Debug second”排除main / config.cpp。 如果你不使用Visual Studio,我相信有一种方法可以用make文件做类似的事情。

答案 6 :(得分:0)

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

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

对于.cpp文件,它是一样的。只需在普通源代码树中有一个.cpp文件,该文件通过#include指令包含该.cpp文件。

干杯&amp;第h。,