2012-09-07 111 views
4

有沒有辦法用c預處理器做一個條件包含?有條件#include in C

我有一個工具庫(Tools.c,Tools.h),由不同團隊共享。這個庫依賴於第二個庫,提供XML功能。讓我們調用一個XML.h現在一個團隊使用第二個庫(XML.h)的普通版本,而另一個團隊在他們的項目中使用擴展版本(XMLEx.h)。第二個團隊不希望包含XML.h,因爲他們已經包含了XMLEx.h,提供了XML.h的所有功能。

有實施類似的機制:只與#define XML_EX提出了更高的(項目)級

#ifdef XML_EX 
#include "XMLEx.h" 
#else 
#include "XML.h" 
#endif 

?像

#include "Tools.h" 

爲Team 1和

#define XML_EX 
#include "Tools.h" 

爲2隊? (我知道,簡單的解決辦法是行不通的,它更說明所需的 「工作流程」。)

邊界條件是:

  • 的Windows系統
  • CVI/LawWindows IDE
  • 沒有make文件
  • Tools.h應該在沒有外部項目的情況下進行編譯。

編輯: 對於建議的解決方案和提示,這是常見的方式,也許它與我的構建過程有關,但它不起作用。 IDE抱怨缺少團隊2的XML.h。我想,這是因爲IDE試圖首先編譯每個源代碼,而不知道「外部」#define。

編輯: 讓我們假裝,團隊A是一堆白癡,怎麼只能擊中IDE中的「RUN」按鈕。因此,最好的是開箱即​​用。編輯: 好吧,它讓我感到困惑。我學到的所有東西都告訴我,它應該起作用。下面是一個最小的一套,我測試過:

的main.c

#define XML_EX 
#include "Tools.h" 

void main(void) 
{ 
    test(); 
} 

隨後的Tools.h

#ifdef XML_EX 
    #include "XMLEx.h" 
#else 
    #include "XML.h" 
#endif 

XMLEx.h已經測試功能UND XMLEx.c實現它。如果我嘗試構建,我會得到一個「XML.h未找到」。在Tools.h中,所有內容都可以使用#define XML_EX

+2

你試過了嗎?這正是很多系統頭文件的工作原理。 –

+0

@Kerrek:是的。我期望它可以工作,但由於某種原因,我的IDE編譯按鈕不起作用,抱怨缺少Team.h的XML.h。 – Oliver

+0

@Oliver:你必須弄清楚是什麼原因,因爲沒有任何問題代碼發佈在這裏。也許在項目中有另一個文件,其中包含「Tools.h」,而沒有先定義「XML_EX」,Team 2使用這個文件 - 這是將定義放在項目設置而不是源文件中的一個很好的理由。 –

回答

0

你可以有一個團隊。h文件,該文件爲團隊A定義任何宏,並且不爲團隊B定義它們或定義不同的值,並且每個團隊都擁有自己的team.h副本。

每個團隊成員也可以通過-D選項將一個宏傳遞給編譯器(至少Linux編譯器支持這個)。我會建議如果你這樣做,你通過TEAM_A或TEAM_B爲了給你在未來更多的靈活性,而不必傳遞更多的宏。

+0

讓我們假裝,團隊A是一堆傻子,怎麼才能打到IDE中的「RUN」按鈕。 – Oliver

+0

完成。我通過項目文件強制使用-D宏。畢竟這是最好的解決方案,雖然沒有人注意到這個「文件中有趣的事情」,但沒有人擔心。 – Oliver

3

您建議的解決方案通常是正在使用的解決方案,而且經常進行。你也可以在makefile/project文件中傳遞宏。

另請注意,Tools.h是一個頭文件,並且將始終作爲另一個文件的一部分進行編譯。

0

我愚弄自己。如上所述,代碼沒有任何問題。我錯誤地解釋了我的IDE的錯誤信息。

至於留在這個例子中,我也有Tools.c和源代碼的編譯失敗(自然),因爲我的項目中沒有XML.h。從項目中刪除源代碼,只需鏈接預編譯的工具即可正常工作。