Linux
glibc 中引用的 __USE_MISC 是如何工作的?
我只是想知道它是如何
__USE_MISC
工作的以及它在哪裡記錄。我看到.h
文件中的一堆函式需要它並提到它。但似乎有些東西正在積極地取消定義它,我想知道正在這樣做以及它是如何做出這個決定的?#define __USE_MISC 1 #include <stdio.h> int main() { printf("%d\n", __USE_MISC); }
退貨
錯誤:使用未聲明的標識符“
__USE_MISC
”如果我將其稱為其他任何名稱,例如
_USE_MISC
、 orUSE_MISC
或,該錯誤就會消失foobar
。我已經用clang和gcc試過了。
__USE_*
宏不應該由使用者定義和檢查,它們是在 glibc 標頭中實現功能選擇器(,_XOPEN_SOURCE
等_GNU_SOURCE
)的機制。整個機制記錄在
features.h
標題的註釋中。標
features.h
頭包含在大多數標準標頭(例如 fromstdio.h
)中,它所做的第一件事是取消定義所有__USE_*
宏,然後根據使用者定義的 、 等宏有選擇地定義_POSIX_C_SOURCE
它們_GNU_SOURCE
。然後標準標頭檔將根據這些__USE_*
宏 ifdef 東西進出。有人可能想知道如何從
__USE_*
宏映射回_*_SOURCE
打開它的宏;例如,有人可能想用 編譯他們的程序gcc -ansi
,看到該psignal()
函式僅在__USE_XOPEN2K8
打開時定義,並且想知道什麼_*_SOURCE
選擇器會得到它們。gcc -ansi -E -dM "-D$source" -include features.h
這是一個使用不同選擇器執行的腳本生成的表:__USE_ATFILE _ATFILE_SOURCE _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=200809L _XOPEN_SOURCE>=700 __USE_FILE_OFFSET64 _FILE_OFFSET_BITS>=64 __USE_GNU _GNU_SOURCE __USE_ISOC11 _GNU_SOURCE _ISOC11_SOURCE __USE_ISOC95 _DEFAULT_SOURCE _GNU_SOURCE _ISOC11_SOURCE _ISOC99_SOURCE _POSIX_C_SOURCE>=200112L _XOPEN_SOURCE>=600 __USE_ISOC99 _DEFAULT_SOURCE _GNU_SOURCE _ISOC11_SOURCE _ISOC99_SOURCE _POSIX_C_SOURCE>=200112L _XOPEN_SOURCE>=600 __USE_LARGEFILE _GNU_SOURCE _LARGEFILE_SOURCE _XOPEN_SOURCE>=500 __USE_LARGEFILE64 _GNU_SOURCE _LARGEFILE64_SOURCE __USE_MISC _DEFAULT_SOURCE _GNU_SOURCE __USE_POSIX _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE _POSIX_SOURCE _XOPEN_SOURCE>=500 __USE_POSIX199309 _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=199309L _XOPEN_SOURCE>=500 __USE_POSIX199506 _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=199506L _XOPEN_SOURCE>=500 __USE_POSIX2 _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=2 _XOPEN_SOURCE>=500 __USE_POSIX_IMPLICITLY _DEFAULT_SOURCE _XOPEN_SOURCE>=500 __USE_REENTRANT _REENTRANT _THREAD_SAFE __USE_UNIX98 _GNU_SOURCE _XOPEN_SOURCE>=500 __USE_XOPEN _GNU_SOURCE _XOPEN_SOURCE>=500 __USE_XOPEN2K _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=200112L _XOPEN_SOURCE>=600 __USE_XOPEN2K8 _DEFAULT_SOURCE _GNU_SOURCE _POSIX_C_SOURCE>=200809L _XOPEN_SOURCE>=700 __USE_XOPEN2K8XSI _GNU_SOURCE _XOPEN_SOURCE>=700 __USE_XOPEN2KXSI _GNU_SOURCE _XOPEN_SOURCE>=600 __USE_XOPEN_EXTENDED _GNU_SOURCE _XOPEN_SOURCE>=500