Linux

glibc 中引用的 __USE_MISC 是如何工作的?

  • February 2, 2019

我只是想知道它是如何__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頭包含在大多數標準標頭(例如 from stdio.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

引用自:https://unix.stackexchange.com/questions/498176