名前


feature_test_macros - 機能検査マクロ

書式


#include <features.h>

説明


機能検査マクロ (feature test macro) により、プログラマは プログラムがコンパイルされる際にシステムのヘッダファイルにより 公開される定義を制御することができる。 この機能を使うと、非標準の定義が公開されないようにでき、 移植性のあるアプリケーションを作成するのに役立つ。 他のマクロを使うと、デフォルトでは公開されない非標準の定義を 公開することができる。 以下で説明する機能検査マクロのそれぞれの正確な影響を確認するには、 ヘッダファイル <features.h> を調べればよい。

機能検査マクロを機能させるには、 「あらゆるヘッダファイルをインクルードする前に」 機能検査マクロを定義しなければならない。 これを実現するには、 コンパイルコマンドで指定する方法 (cc -DMACRO=value) と、ソースコードであらゆるヘッダをインクルードする前に 必要なマクロを定義する方法がある。

Linux/glibc は以下の機能検査マクロを解釈する:
_POSIX_C_SOURCE
 このマクロを値 1 で定義すると、ヘッダファイルで POSIX.1-1990 と ISO C (1990) に準拠する定義が公開される。 199309 以上の値で定義すると、 POSIX.1b (リアルタイム拡張) 関連の定義が追加で公開される。 199506 以上の値で定義すると、 POSIX.1c (スレッド) 関連の定義が追加で公開される。 値 200112 で定義すると、(XSI 拡張を除く) POSIX.1-2001 基本仕様に 対応する定義が公開される。
_POSIX_SOURCE
 このマクロは廃止予定である。 このマクロが定義されると、値に関わらず、 _POSIX_C_SOURCE を値 1 で定義するのと等価となる。
_XOPEN_SOURCE
 このマクロを定義すると、どんな値でも、ヘッダファイルで POSIX.1, POSIX.2, XPG4 に準拠する定義が公開される。 500 以上の値で定義すると、SUSv2 (UNIX 98) 関連の定義が 追加で公開される。 600 以上の値で定義すると、 SUSv3 (UNIX 03; POSIX.1-2001 基本仕様 + XSI 拡張と同じ) 関連の定義と C 99 での定義が追加で公開される。
_XOPEN_SOURCE_EXTENDED
 このマクロが値 1 で定義され、さらに _XOPEN_SOURCE が定義されていると、XPG4v2 UNIX 拡張に対応する定義が公開される。
_ISOC99_SOURCE
 ISO C (1990) の C 99 拡張を公開する。
_LARGEFILE64_SOURCE
 LFS (Large File Summit) により "暫定拡張 (transitional extension)" Single UNIX Specification として規定された代替 API に関する定義を公開する (http://opengroup.org/platform/lfs.html 参照)。
_FILE_OFFSET_BITS
 このマクロを値 64 で定義すると、ファイル I/O とファイルシステム操作に 関連する 32 ビット版の関数とデータタイプは自動的に 64ビット版に 変換される。 これは、32ビットシステムで大きなファイル (> 2ギガバイト) の I/O を実行する際に役立つ。
_BSD_SOURCE
 このマクロを定義すると (値に関わらず) ヘッダファイルで BSD 由来の定義が公開される。 また、このマクロを定義すると、相容れない標準が存在する状況において BSD 由来の定義を優先するようになる。
_SVID_SOURCE
 このマクロを定義すると (値に関わらず) ヘッダファイルで System V 由来の定義が公開される (SVID == System V Interface Definition; standards(7) 参照)。
_GNU_SOURCE
 このマクロを定義すると (値に関わらず) 以下のマクロを定義するのと 等価になる: _BSD_SOURCE, _SVID_SOURCE, _LARGEFILE64_SOURCE, _ISOC99_SOURCE, 値 1999506 の _POSIX_C_SOURCE 値 600 の _XOPEN_SOURCE。 さらに、各種の GNU 固有の拡張も公開される。
_REENTRANT
 このマクロを定義すると、いくつかのリエントラント (再入可能) な関数 定義が公開される。マルチスレッド・プログラムでは、この代わりに cc -pthread を使用すること。
_THREAD_SAFE
 _REENTRANT の同義語。 他のいくつかの実装との互換性を提供するためのもの。
_FORTIFY_SOURCE
 このマクロを定義すると、文字列やメモリの操作を行う様々な関数を 使用する際にバッファオーバーフローを検出するための軽めのチェックが 実行されるようになる。すべてのバッファオーバーフローが検出される わけではなく、あくまでよくある例についてだけである。 現在の実装では、以下の関数にチェックが追加されている: memcpy(3), mempcpy(3), memmove(3), memset(3), stpcpy(3), strcpy(3), strncpy(3), strcat(3), strncat(3), sprintf(3), snprintf(3), vsprintf(3), vsnprintf(3), gets(3). _FORTIFY_SOURCE が 1 に設定された場合、コンパイラの最適化レベルが 1 (gcc -O1) かそれ以上であれば、規格に準拠するプログラムの振る舞いを 変化させないようなチェックが実行される。 _FORTIFY_SOURCE が 2 に設定された場合、さらなるチェックが追加されるが、 規格に準拠するプログラムのいくつかが失敗する可能性がある。 いくつかのチェックはコンパイル時に実行でき、コンパイラの警告として 表示される。他のチェックは実行時に行われ、チェックに失敗した場合 には実行時エラーとなる。 このマクロを使用するにはコンパイラの対応が必要であり、 バージョン 4.0 以降の gcc(1) で利用できる。
gcc(1) が起動されると、デフォルトで _BSD_SOURCE, _SVID_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE=199506 が定義される。 個々のマクロが定義されると、明示的に定義された場合を除き 他のマクロは無効となる (例外: _POSIX_C_SOURCE が他で定義されていない場合には、 _POSIX_C_SOURCE は常に値 200112 (バージョン 2.4 より前の glibc では 199506) で定義される。 但し、コンパイラが使用する標準を指定するモードで起動された場合 (-std=c99 フラグ) はこの限りではない)。 また、複数のマクロを定義することもできる。 この場合、定義したマクロはすべて有効になる。

準拠


POSIX.1 では _POSIX_C_SOURCE, _POSIX_SOURCE, _XOPEN_SOURCE が規定されている。 _XOPEN_SOURCE_EXTENDED は XPG4v2 (別名 SUSv1) で規定されていた。 _FILE_OFFSET_BITS はどの標準でも規定されていないが、 他のいくつかの実装で採用されている。 _BSD_SOURCE, _SVID_SOURCE, _GNU_SOURCE, _FORTIFY_SOURCE, _REENTRANT, _THREAD_SAFE は Linux (glibc) 固有である。

注意


<features.h> は Linux/glibc 固有のヘッダファイルである。 他のシステムにも同様の目的のファイルがあるが、普通は違う名前である。 このヘッダファイルは、他のヘッダファイルにより必要に応じて 自動的にインクルードされる。機能検査マクロを利用するために 明示的にインクルードする必要はない。

上記の機能検査マクロのうちどれが定義されたかにしたがって、 <features.h> は、他の glibc ヘッダファイルでチェックされる各種の他のマクロを、 内部で定義する。これらのマクロの名前はアンダースコア 2つで始まる (例えば __USE_MISC)。 ユーザプログラムはこれらのマクロを 決して 直接定義すべきではない。 代わりに、上記のリストにある適切な機能検査マクロを利用すべきである。

openSUSE Logo

コンテンツ