簡體   English   中英

我可以設置編譯時標志以包含 header 嗎?

[英]Can I set a compile time flag to include a header?

我有一個配置 class 我想用於各種構建。 class 本身在構建之間會發生變化,但 class 名稱保持不變,header 文件名也是如此。

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

前任。

  • 主/config.h

  • 主/config.cpp

  • 輔助/config.h

  • 二級/config.cpp

有沒有一種好方法可以通過編譯時標志或命令行選項讓構建確定使用哪個標頭/cpp? 我已經有很多配置,並且希望將來有更多配置。 我想避免一長串#ifdef/#elif/#elif/etc..

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

#include 指令並不真正關心內容。

您可以輕松地在項目中使用一個存根 class:

存根.cpp

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

當然,如有必要,您可以對標頭執行相同的操作。

根據您使用的構建系統,您將創建一個指向主路徑或輔助路徑的變量。 然后,此變量用於 append 到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

您可以像這樣放入 header/cpp 保護:

#ifdef OPTION_A

...

#endif

您可以使用編譯時#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

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

您可以將公共文件放在 Common 目錄中,而將其他文件放在單獨的目錄中 - 每個配置一個目錄。

在 Visual Studio(如果那是您的 IDE)中,您可以有多個“配置”(默認為調試和發布),並且每個構建中可能不包含某些文件。 您可以將配置“Debug main”排除在輔助/config.cpp 之外,並將配置“Debug second”排除在 main/config.cpp 之外。 如果您不使用 Visual Studio,我相信有一種方法可以對 make 文件執行類似的操作。

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

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

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

干杯&hth.,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM