簡體   English   中英

-D_DEFAULT_SOURCE做什么?

[英]What does -D_DEFAULT_SOURCE do?

以前我收到了來自gcc -std=c99警告,暗示usleep()已被隱式聲明。 然后我偶然發現了這個stackoverflow帖子 ,這導致我使用-D_BSD_SOURCE 但是,現在gcc告訴我-D_BSD_SOURCE已被棄用,我應該使用-D_DEFAULT_SOURCE

#warning "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE"

為什么-D_BSD_SOURCE已被棄用? 為什么要使用-D_DEFAULT_SOURCE 它做了什么?

我做了一些谷歌搜索 ,結果只是讓人們用它來關閉gcc 我無法找到為什么 -D_BSD_SOURCE已被棄用,只是它已被棄用。

glibc手冊描述了每個功能測試宏(FTM),包括_DEFAULT_SOURCE

如果你定義這個宏,大多數功能都包含在X / Open,LFS和GNU擴展中:效果是啟用2008版POSIX的功能,以及某些BSD和SVID功能,而無需單獨的功能測試宏來控制他們。 單獨定義此宏並且不使用-ansi-std=c99等編譯器選項,與不定義任何特征測試宏具有相同的效果。 將其與其他功能測試宏一起定義,或者在使用-ansi等選項時,即使其他選項會導致它們被禁用,也會啟用這些功能。

這篇關於FTM的LWN.net文章為我們提供了一個基本原理(其中可能還有一些有趣的信息):

最初的意圖似乎是,在使用FTM的每個glibc頭文件中,只有一個__USE_*內部宏應該控制任何特定定義的暴露。 此外,不應在嵌套的#ifdef指令中使用宏。 對glibc頭文件的快速檢查表明,現實遠非意圖,這種情況導致Roland McGrath 認為是時候進行大規模清理以使事情恢復到預期的狀態。 Roland認為通過消除_BSD_SOURCE_SVID_SOURCE FTM可以簡化任務,雖然它們歷史上有一個目的,但最近已經不再有用了。 他說,現代源代碼所需的唯一宏是那些與正式標准和_GNU_SOURCE相關的_GNU_SOURCE

約瑟夫邁爾斯正式承擔了一系列補丁,以實施這項工作的第一步。 Roland鼓勵的保守方法意味着_BSD_SOURCE_SVID_SOURCE FTM的棄用發生在兩個glibc版本之間。 glibc 2.19版增加了一個新的FTM, _DEFAULT_SOURCE 定義此宏會導致默認定義暴露,即使其他宏的顯式定義會導致不發生這種定義。 定義此宏的效果等同於在早期glibc版本中顯式定義三個宏的效果:

 cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809C 

因此,如果您需要定義_BSD_SOURCE_SVID_SOURCE ,也只需定義_DEFAULT_SOURCE glibc版本<= 2.18不關心它,版本> = 2.19如果定義了兩個或全部三個,則不會發出警告。

我需要超出linux和glibc之外的可移植性,我不喜歡#ifdef。 所以:

/* asprintf() does not appear on linux without this */
#define _GNU_SOURCE

/* gettimeofday() does not appear on linux without this. */
#define _BSD_SOURCE

/* modern glibc will complain about the above if it doesn't see this. */
#define _DEFAULT_SOURCE

暫無
暫無

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

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