我只是想知道它是如何__USE_MISC
工作的以及它的记录在哪里。我看到文件内的许多函数.h
需要它并提及它。但似乎有些东西正在积极地取消定义它,我想知道正在这样做以及它是如何做出这个决定的?
#define __USE_MISC 1
#include <stdio.h>
int main()
{
printf("%d\n", __USE_MISC);
}
退货
错误:使用未声明的标识符“
__USE_MISC
”
_USE_MISC
如果我将其称为其他名称,例如, or USE_MISC
or ,该错误就会消失foobar
。
我已经用 clang 和 gcc 尝试过了。
答案1
这些__USE_*
宏不应该由用户定义和检查,它们是一种在 glibc 标头中实现功能选择器(_XOPEN_SOURCE
、_GNU_SOURCE
等)的机制。
整个机制记录在评论中features.h
标头。
该features.h
标头包含在大多数标准标头(例如 from stdio.h
)中,它所做的第一件事是取消定义所有__USE_*
宏,然后根据用户定义的 、 等宏_POSIX_C_SOURCE
有选择地定义它们。_GNU_SOURCE
然后标准标头将根据这些宏来 ifdef 内容__USE_*
。
人们可能想知道如何从一个__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