__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で試しました。
__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