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または など、別の名前で呼び出すとUSE_MISCエラーが消えますfoobar

私はclangとgccを使ってみました。

答え1

これらのマクロは、ユーザーが定義または確認しないでください。glibc__USE_*ヘッダーに機能セレクタ(など)_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_*_SOURCEgcc -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

関連情報