glibc 中引用的 __USE_MISC 如何工作?

glibc 中引用的 __USE_MISC 如何工作?

我只是想知道它是如何__USE_MISC工作的以及它的记录在哪里。我看到文件内的许多函数.h需要它并提及它。但似乎有些东西正在积极地取消定义它,我想知道正在这样做以及它是如何做出这个决定的?

#define __USE_MISC 1
#include <stdio.h>

int main()
{
  printf("%d\n", __USE_MISC);
}

退货

错误:使用未声明的标识符“ __USE_MISC

_USE_MISC如果我将其称为其他名称,例如, or USE_MISCor ,该错误就会消失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

相关内容