簡體   English   中英

當我使用GNU C Library提供的非標准函數時,Clang可以警告我嗎?

[英]Can Clang warn me when I use non-standard functions provided by the GNU C Library?

我正在OS X上編寫一個C程序並用clang編譯它。 我是C的新手,我已經明白,像getline()這樣的函數很有用但非標准。 我希望能夠在GNU C庫不可用的系統上編譯程序。 我不知道究竟哪些函數是非標准的,我希望有一個命令行開關讓clang在我使用這些函數時警告我。 在那兒?

clang --version輸出:

Apple LLVM 5.1版(clang-503.0.40)

您可以使用功能測試宏 (另請參閱: XSH 2.2.1 POSIX.1符號 )來請求僅查看特定的一組標准接口。 特別是,

-D_XOPEN_SOURCE=600

在命令行或

#define _XOPEN_SOURCE 600

應該為過時的2001版POSIX(最新的OSX支持)公開POSIX base和XSI選項。 如果你只想要沒有XSI的基礎,那么將_POSIX_C_SOURCE定義為200112L

沒有命令行開關說'告訴我這是不是非標准'。 開發需要在各種平台上兼容的代碼的最常見方法是gnu autotools套件 ,它為您提供了一個配置腳本,它可以檢查各種功能並允許您對其進行編碼,或讓系統在放棄之前放棄進一步。

您可以定義一個功能測試宏,如_POSIX_C_SOURCE _POSIX_C_SOURCE存在且未定義實現定義的特征測試宏(如_BSD_SOURCE_GNU_SOURCE )時,需要符合實現來隱藏任何擴展(即額外的庫函數):

#define _POSIX_C_SOURCE 200809L

如果您嘗試使用擴展並定義了此宏,則會收到警告(ANSI模式)或錯誤(C99)模式,因為該函數的原型不存在。

對於Mac OS X,沒有POSIX.1 2008支持。 因此,您必須像這樣定義宏以獲得POSIX.1 2001支持:

#define _POSIX_C_SOURCE 200112L

請注意,在POSIX.1 2008中刪除了一些函數,但這並不重要,因為這些函數通常(讀取:始終)存在於目標系統上,因為它可能也支持POSIX.1 2001。

不,沒有,主要是因為我所知道的任何項目通常會區分:

  • 編譯器
  • 標准庫
  • ABI圖書館

通常這三件東西被分成不同的項目,它們被設計成不會相互插入。 有時甚至會有一個更加分散的願景,編譯器分為后端,前端和其他多個模塊化項目和插件,就像在帶有clang的大型llvm項目中發生的那樣。

正如Petesh已經建議的那樣,您最好的選擇是具有這種能力的建築系統,您可以編寫構建過程的行為腳本並檢測宏是否失敗,或者目標系統是否提供X功能。

我的建議,特別是初學者,是cmake和它自己的wiki

暫無
暫無

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

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