2009-07-13 67 views
6

我正在用C++編寫一個小型庫,我需要能夠在很多不同的平臺上構建,包括iPhone,Windows,Linux,Mac和Symbian S60。我已經編寫了大部分代碼,以便它是平臺不可知的,但有一些部分必須在每個平臺上編寫。Platform C預處理器定義

目前,我通過根據當前平臺包含不同的頭文件來實現這一目標,但是由於我不確定在所有平臺上定義了哪些預處理器定義,因此我無法充實它。對於Windows,我通常可以依靠看到WIN32或_WIN32。對於Linux,我可以依靠看到_UNIX_,但我不太確定其他平臺或其64位變體。有沒有人有平臺上找到的不同定義的列表,或者我將不得不求助於配置文件或gcc參數?

回答

9

我在我的書籤中有this sourceforge pre-compiler頁面。

+0

我編輯你的鏈接指向新的wiki-ized版本,儘管Google總是指向舊版本。 – rubenvb 2011-08-31 15:16:43

+0

沒關係,謝謝。 – 2011-08-31 15:31:25

0

C或C++標準都沒有定義這樣的符號,所以你將會受到特定C或C++實現的支配。常用的符號列表將是一個有用的東西,但不幸的是我沒有一個。

0

我不認爲存在一個通用的平臺定義列表,根據我看到的每個跨平臺庫都有一個ad-hoc config.h充滿了這些東西。但是,你可以考慮在尋找使用相當便攜庫的libpng一樣的那些,zlib的等

這是一個被libpng

0

的定義將是純粹到你的編譯器供應商所使用的。如果你在所有的平臺上使用相同的編譯器(比如說gcc),那麼你就可以輕鬆一點。

您可能還想嘗試組織您的項目,使大多數.h文件不依賴於平臺。將你的實現(cpp文件)拆分成單獨的文件;一個用於非特定的東西,另一個用於每個平臺。特定於平臺的平臺可以包含僅對該平臺有意義的「私有」頭文件。你可能不得不使適配函數得到類似這樣的東西來工作100%(當系統庫取得稍微不同的參數時),但我發現它最終確實有用,並且引入新的平臺變得更容易在將來。

0

如果你想通過給定的系統上,你必須GCC默認的預處理器符號看(如Mac OS X中的iOS,Linux的),你可以在命令行這樣的完整列表:

echo 'main(){}' | cpp -dM 

然而,這些通常是有限的使用,因爲在預處理器運行的編譯階段,大多數符號僅標識系統的操作系統和CPU類型託管編譯器而不是系統有針對性的(例如,針對iOS的交叉編譯)。在Mac OS X和iOS,確定成爲攻擊目標系統的編譯時間特性的正確方法是

#include <TargetConditionals.h> 

這將從目前使用的平臺和SDK拿起TargetConditionals.h,然後你就可以確定(例如)一些宏的字節順序和一些其他特徵。 (通過TargetConditionals.h看看你能收集哪些類型的信息。)