2011-03-21 498 views
80

我最近遇到了一些代碼,gcc不會在沒有這個參數的情況下編譯。我檢查了gcc手冊頁,但沒有找到這個特定的選項。我確實發現了XOPEN_SOURCE,但是它沒有什麼解釋。-D_XOPEN_SOURCE做什麼/意思?

有人可以詳細說明嗎?我知道-D_XOPEN_SOURCE可以設置爲不同的值,例如400,600,但是這些都可以做什麼?

回答

105

當你

#define _XOPEN_SOURCE <some number> 

cc -D_XOPEN_SOURCE=<some number> 

它會告訴你的編譯器,包括用於在X/Open和POSIX標準中定義的一些額外的功能定義。

這會給你一些額外的功能,存在於最新的UNIX/BSD/Linux系統,但可能不存在於其他系統,如Windows。

這些數字指的是不同版本的標準。

你可以告訴你需要(如果有的話)通過查看每次調用函數的手冊頁,其中之一。

例如,man strdup說:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)): 

     strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 
     strndup(), strdupa(), strndupa(): _GNU_SOURCE 

這意味着你應該把其中的一個:

#define _SVID_SOURCE 
#define _BSD_SOURCE 
#define _XOPEN_SOURCE 500 
#define _XOPEN_SOURCE 600 
#define _XOPEN_SOURCE 700 

在你的源文件的頂部做任何#include年代以前,如果你想使用strdup

或者你可以把

#define _GNU_SOURCE 

有相反,它使所有的功能,用它可能無法在Solaris,FreeBSD的,Mac OS X的編譯下跌等

這是一個好主意在執行#include#define或使用新函數之前檢查每個手冊頁,因爲它們的行爲有時會根據您擁有的選項和#define而變化,例如basename(3)

參見:

+1

只是一個評論,強調「在你的源文件的頂部」是多麼重要的是這些語言方言定義。如果他們不在最頂層,他們就不起作用。 – 2016-01-04 19:45:21

3

這暴露頭屬於一個給定的規範,如posix的定義。 它所屬的實際標準是由值(例如400或600)定義的。 請參閱Reference以瞭解標準/值的綁定。

7

-D是定義預處理器變量的c編譯器選項。在這種情況下_XOPEN_SOURCE

這實際上並不影響編譯器本身的行爲,而是改變了一些庫的使用方式,例如,標準c庫,表現得很好。有幾個這樣的選項。在大多數情況下,它們與某些有關UNIX特定編程接口的標準文檔或某些特定的庫供應商有關。

定義其中的一個有時是必需的,因爲某些標準函數的行爲或甚至它們的簽名可能在不同標準之間有所不同。因此,您可能必須使用-D_XOPEN_SOURCE或類似的東西才能打開兼容模式。

這些標誌的另一種可能用法是通過轉換C庫實現提供的擴展來確保源代碼保持在特定標準的範圍內。這是您可以用來確保代碼在儘可能多的平臺上運行的措施之一。

0

對於一些未知reaso n,Mac OS/X(XCode)需要600來定義strdup(),儘管它在1995年的規範中。 Mozilla和others已經遇到了這個......