[英]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.