我有一个配置类,我想用于各种构建。类本身在构建之间发生变化,但类名仍然与头文件名相同。
此类的单独版本保存在单独的子文件夹中。
离。
主/ config.h中
主/ config.cpp
次级/ config.h中
次级/ config.cpp
有没有一种好的方法,通过编译时标志或命令行选项,让构建确定要使用哪个头/ cpp?我已经有很多配置,并且预计将来会有更多配置。我想避免一长串的#ifdef /#elif /#elif / etc ..
编辑:我想避免使用单独的构建,并且希望避免在整个代码中使用#defines。如果我之前没有说清楚,我很抱歉! > _<
答案 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。,