2011-08-16 57 views
4

我有一個配置類,我想用於各種構建。類本身在構建之間更改,但類名與頭文件名保持相同。我可以設置一個編譯時間標誌來包含一個頭文件嗎?

此類的單獨版本保存在單獨的子文件夾中。

ex。

  • 主/ config.h中

  • 主/ config.cpp

  • 次級/ config.h中

  • 次級/ config.cpp

是有一個很好的方法,通過編譯時標誌或命令行選項,有建立確定使用哪個頭/ CPP?我已經有了很多配置,並且預計未來還會有更多配置。我想避免#ifdef /#elif /#elif /等很長的列表。

編輯:我想避免單獨構建,並希望避免在整個代碼中使用#define。如果我以前沒有說清楚,我很抱歉! > _ <

+0

使用預編譯不是一種選擇? –

+2

你正在使用什麼構建系統? Makefiles,cmake,vs,msbuild等 –

+0

'......我想用於各種構建。類本身在構建之間變化...'和'我想避免分開構建'這些看起來很有爭議。你能解釋一下嗎? –

回答

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

0

你可以把你的頭/ CPP衛士這樣的:

#ifdef OPTION_A 

... 

#endif 
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 
+0

我想避免這種情況,因爲我有很多構建以及#ifdef/#elif/etc ...集合將是難看和難以維持。 – Maixy

+0

你使用的是構建系統嗎? – 2011-08-16 18:43:12

2

#include指令不使用編譯時真的關心內容。

你可以很容易有你在項目中使用一個存根類:

stub.cpp

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

,當然,如果必要,可以做同樣的事情有頭。

+0

對不起,我之前並不清楚,我試圖避免在整個代碼中散佈#ifdef和#define值,如果可能的話。 – Maixy

+0

這不是一個散射,在這個答案中,這些是唯一的五個,都在他們自己的文件中。 –

0

我認爲最好的選擇是使用幾個makefile或任何你使用的。每個配置一個。不要讓你的源文件不可讀。

您可以將通用文件放在公用目錄中,將其他文件放在不同的目錄中 - 每個配置一個目錄。

0

在Visual Studio(如果那是你的IDE ) 你可以有多個「配置」(默認爲「調試和發佈」),並且每個構建中都可能包含某些文件。您可以配置排除secondary/config.cpp的配置「Debug main」,排除main/config.cpp的配置「Debug second」。 如果您使用的不是Visual Studio,我相信有一種方法可以與make文件做類似的事情。

0

您可以將相關目錄添加到編譯器包含路徑的前面。

您可以通過一些編譯器選項(取決於編譯器)更改編譯器的包含路徑。

對於.cpp文件,它是一樣的。只需在您的普通源代碼樹中包含.cpp文件,該文件通過#include指令包含該.cpp文件。

乾杯&心連心,

相關問題