web-dev-qa-db-ja.com

glibcで参照される__USE_MISCはどのように機能しますか?

__USE_MISCがどのように機能し、どこに文書化されているのか疑問に思っています。 .hファイル内の多数の関数がそれを必要とし、言及しているのがわかります。しかし、何かが積極的にそれを定義していないようであり、私はそれを行っていること、そしてそれがどのようにその決定を下すのか知りたいですか?

#define __USE_MISC 1
#include <stdio.h>

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

戻り値

エラー:宣言されていない識別子 '__USE_MISC'の使用

_USE_MISCUSE_MISCfoobarなど、他の名前を付けると、このエラーはなくなります。

私はこれをclangとgccで試しました。

2
Evan Carroll

__USE_*マクロは、ユーザーが定義およびチェックすることを想定していません。これらは、glibcヘッダーに機能セレクター(_XOPEN_SOURCE_GNU_SOURCEなど)を実装するメカニズムです。

メカニズム全体は、 features.h ヘッダーのコメントに記載されています。

features.hヘッダーは、ほとんどの標準ヘッダー(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
3
mosvy