2014-02-20 37 views
0

因此,我正在編寫可移植嵌入式ANSI C代碼,試圖支持多個編譯器和硬件目標。每個編譯器/硬件供應商都支持不同的math.h函數。有的只支持C90,有的支持C99的子集,有的支持C99的全套。ISO C90/99檢查是否存在編譯器特定功能

我試圖找到一種方法來檢查預處理器中是否存在給定函數,以便我可以使用自定義宏如果它不存在。有些供應商在math.h中有外部函數,有些使用#define重新映射到某個內部調用。是否有一段代碼可以判斷它是否爲#defined或extern函數?我可以使用#ifdef作爲定義,但實際的函數調用呢?

+0

是否檢查編譯器是否支持C99滿足您? –

+2

您需要['autoconf'](http://www.gnu.org/software/autoconf/)。是的,這與合作是一種痛苦,但它是這項具體工作的最佳工具。 (它爲您實現了「編寫一系列測試.c文件,編譯它們,查看返回的錯誤代碼,並設置keshlam建議的相應-D標誌」的過程。) – zwol

+0

您也可以使用[CMake]( http://www.cmake.org/),這是'autoconf'的更好選擇,因爲它是可移植的。它也很容易使用 – 2014-02-20 03:15:44

回答

0

通常的解決方案是查看由預處理器本身定義的宏或作爲-D定義傳遞到構建過程中,這些定義標識您正在運行的編譯器和平臺,並使用這些定義以及您對哪些特殊協助每個環境需要配置您的代碼。

我想你可以編寫一系列測試.c文件,嘗試編譯它們,查看返回的錯誤代碼,並使用它們來設置適當的-D標誌......但我不相信這將是任何清潔器。

+0

如果OP最終編寫了一個檢查腳本而不是使用現有的autoconf配方或類似工具,請考慮問題I覆蓋此處:http://ewontfix.com/13/ –

相關問題