Provided by: manpages-ja_0.5.0.0.20210215+dfsg-1_all bug

名前

       feature_test_macros - 機能検査マクロ

書式

       #include <features.h>

説明

       機能検査マクロ  (feature test macro) により、プログラマは プログラムがコンパイルされる際に
       システムのヘッダーファイルにより 公開される定義を制御することができる。

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

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

   マニュアルページでの機能検査マクロの要件の規定
       関数が機能検査マクロの定義を必要とする場合、 マニュアルページの書式 (SYNOPSIS) の節に 以下
       の形式の注釈を入れる (以下の例は acct(2)  のマニュアルページからの引用である)。

               #include <unistd.h>

               int acct(const char *filename);

           glibc 向けの機能検査マクロの要件
           (feature_test_macros(7)
           参照):

               acct(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

       ||  は、  acct(2)   の定義を <unistd.h> から得るには、以下のマクロの定義のいずれかを、どの
       ヘッダーファイルの インクルードよりも前で行わなければならないことを意味する。

              #define _BSD_SOURCE
              #define _XOPEN_SOURCE        /* 500 未満の任意の値 */

       別の方法としては、等価な定義をコンパイル用のコマンドで 指定することもできる。

              cc -D_BSD_SOURCE
              cc -D_XOPEN_SOURCE           # 500 未満の任意の値

       後で述べるが、 「いくつかの機能検査マクロはデフォルトで定義される」 点に注意すること。  こ
       のため、「書式」に記載された機能検査マクロを常に 明示的に指定する必要があるわけではない。

       あまり多くないが、マニュアルページによっては、  機能検査マクロの要件を以下のように簡単な表
       現で記載する場合がある。 (以下の例は readahead(2)  のマニュアルページからの引用である)。

              #define _GNU_SOURCE
              #include <fcntl.h>

              ssize_t readahead(int fd, off64_t *offset, size_t count);

       関数定義の公開に使える機能検査マクロが一つだけで、  デフォルトではそのマクロが定義されない
       場合に、 この形式の表現を利用する。

   glibc が解釈する機能検査マクロ
       以下では、Linux  glibc 2.x (x > 0) において、 機能検査マクロがどのように扱われるかを説明す
       る。

       Linux/glibc は以下の機能検査マクロを解釈する:

       __STRICT_ANSI__
              ISO 標準の C。 gcc(1)  を -std=c99-ansi などのフラグを付けて起動した場合、 この
              マクロは暗黙のうちに定義される。

       _POSIX_C_SOURCE
              このマクロを定義すると、ヘッダーファイルで以下の定義が公開される。

              ·  値が 1 の場合、POSIX.1-1990 と ISO C (1990) に準拠する定義が公開される。

              ·  値が 2 以上の場合、 POSIX.2-1992 関連の定義も追加で公開される。

              ·  値が  199309 以上の場合、 POSIX.1b (リアルタイム拡張) 関連の定義が追加で公開され
                 る。

              ·  値が 199506 以上の場合、 POSIX.1c (スレッド) 関連の定義が追加で公開される。

              ·  (glibc 2.3.3 以降)  値が 200112L 以上の場合、 (XSI 拡張を除く) POSIX.1-2001 基本
                 仕様に対応する定義も追加で公開され、また  C95  (glibc  2.12  以降) と C99 (glibc
                 2.10 以降) の機能も公開される。

              ·  (glibc 2.10 以降)  値が 200809L 以上の場合、 (XSI 拡張を除く) POSIX.1-2008  基本
                 仕様に対応する定義が追加で公開される。

       _POSIX_SOURCE
              このマクロは廃止予定である。               このマクロが定義されると、値に関わらず、
              _POSIX_C_SOURCE を値 1 で定義するのと等価となる。

       _XOPEN_SOURCE
              このマクロを定義すると、ヘッダーファイルで以下の定義が公開される。

              ·  どんな値でも、ヘッダーファイルで POSIX.1, POSIX.2, XPG4 に準拠する定義が公開され
                 る。

              ·  値が 500 以上の場合、 SUSv2 (UNIX 98) 関連の定義が追加で公開される。

              ·  (glibc  2.2 以降)  値が 600 以上の場合、 SUSv3 (UNIX 03; POSIX.1-2001 基本仕様 +
                 XSI 拡張と同じ) 関連の定義と C99 での定義が追加で公開される。

              ·  (glibc 2.10 以降)  値が 700 以上の場合、 SUSv4 (POSIX.1-2008 基本仕様 + XSI 拡張
                 と同じ) 関連の定義が追加で公開される。

              __STRICT_ANSI__  が定義されていない場合、または _XOPEN_SOURCE が 500 以上の値で定義
              されていて、 _POSIX_SOURCE_POSIX_C_SOURCE  も明示的に定義されていない場合、以下
              のマクロが暗黙のうちに定義される。

              ·  _POSIX_SOURCE が値 1 で定義される。

              ·  _POSIX_C_SOURCE は、_XOPEN_SOURCE の値に基づいて定義される。

                     _XOPEN_SOURCE < 500
                            _POSIX_C_SOURCE が値 2 で定義される。

                     500 <= _XOPEN_SOURCE < 600
                            _POSIX_C_SOURCE が値 199506L で定義される。

                     600 <= _XOPEN_SOURCE < 700
                            _POSIX_C_SOURCE が値 200112L で定義される。

                     700 <= _XOPEN_SOURCE (glibc 2.10 以降)
                            _POSIX_C_SOURCE が値 200809L で定義される。

       _XOPEN_SOURCE_EXTENDED
              このマクロが定義され、さらに  _XOPEN_SOURCE が定義されていると、XPG4v2 (SUSv1) UNIX
              拡張 (UNIX 95) に対応する定義が公開される。 _XOPEN_SOURCE が 500 以上の値で定義され
              た場合、このマクロは暗黙のうちに定義される。

       _ISOC99_SOURCE (glibc 2.1.3 以降)
              ISO C99 標準に準拠した宣言を公開する。

              初期のバージョン  2.1.x の glibc では、これと等価な _ISOC9X_SOURCE という名前のマク
              ロが使われていた      (なぜなら、C99      標準はまだ確定していなかったからである)。
              _ISOC9X_SOURCE  マクロの使用は廃止されているが、 glibc は過去との互換性のため今でも
              このマクロを認識する。

              _ISOC99_SOURCE を定義すると、 ISO C (1990) Amendment 1  ("C95")  の定義も公開される
              (C95 での主要な変更点は国際化文字集合のサポートであった)。

       _ISOC11_SOURCE (glibc 2.16 以降)
              ISO C11 標準に準拠した宣言を公開する。 このマクロを定義すると (_ISOC99_SOURCE 同様)
              C99 と C95 の機能も有効になる。

       _LARGEFILE64_SOURCE
              LFS (Large File Summit) により  "暫定拡張  (transitional  extension)"  Single  UNIX
              Specification  として規定された代替  API (alternative API) に関する定義を公開する (
              ⟨http://opengroup.org/platform/lfs.html⟩ 参照)。 代替 API は新規オブジェクト  (関数
              と型)  の集合で構成され、  その名前は  "64" で終わる (例えば、 off_t に対応するのは
              off64_tlseek()  に対応するのは lseek64()  である)。 新しいプログラムではこのマク
              ロを利用しないこと。 代わりに _FILE_OFFSET_BITS=64 を利用すること。

       _LARGEFILE_SOURCE
              このマクロは、歴史的には、ファイルオフセットで  long int を使う以前の API (fseek(3)
              や ftell(3)) の制限を解決する関数 (特に fseeko(3) と ftello(3))  を公開するのに使わ
              れていた。 このマクロは _XOPEN_SOURCE が 500 以上の値で定義されている場合に暗黙のう
              ちに定義される。             新しいプログラムでぇあこのマクロは使用すべきではない。
              _XOPEN_SOURCE をただ定義するか、 _FILE_OFFSET_BITS を値 64 で定義するのが、同じ結果
              を得るための推奨される方法である。

       _FILE_OFFSET_BITS
              このマクロを値 64 で定義すると、ファイル I/O とファイルシステム操作に  関連する  32
              ビット版の関数とデータタイプは自動的に 64 ビット版に 変換される。 これは、32 ビット
              システムで大きなファイル (> 2 ギガバイト) の I/O を実行する際に役立つ (このマクロを
              定義すると、コンパイルし直すだけで大きなファイルを 扱えるプログラムを書くことができ
              る)。

              64 ビットシステムは、もともと 2 ギガバイトより大きなファイルを 扱えるので、64  ビッ
              トシステムではこのマクロは効果を持たない。

       _BSD_SOURCE (glibc 2.20 以降では非推奨)
              このマクロを定義すると、値に関わらず、ヘッダーファイルで  BSD  由来の定義が公開され
              る。

              バージョン 2.18 以前の glibc では、このマクロを定義すると、相容れない標準が存在する
              状況において    BSD    由来の定義を優先するようになる。    ただし、   _SVID_SOURCE,
              _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED,  _GNU_SOURCE
              が一つでも定義された場合には、BSD  由来の定義は優先されなくなる。 glibc 2.19 以降で
              は、 _BSD_SOURCE を定義しても相容れない標準があっても BSD  由来の定義が優先されるこ
              とはもはやなくなった。

              glibc  2.20 以降では、このマクロは非推奨である。 このマクロは現在は _DEFAULT_SOURCE
              を定義するのと同じ効果を持つが、 (_DEFAULT_SOURCE  が合わせて定義されていない場合に
              は) コンパイル時の警告が出る。 代わりに _DEFAULT_SOURCE を使用すること。 glibc 2.19
              以前で _BSD_SOURCE が必要で glibc 2.20 以降で _DEFAULT_SOURCE  を必要とするプログラ
              ムを警告を出さずにコンパイルするには、  _BSD_SOURCE_DEFAULT_SOURCE両方を定義
              すること。

       _SVID_SOURCE (glibc 2.20 以降では非推奨)
              このマクロを定義すると (値に関わらず) ヘッダーファイルで System V  由来の定義が公開
              される (SVID == System V Interface Definition; standards(7)  参照)。

              glibc 2.20 以降、 _BSD_SOURCE と同様にこのマクロは非推奨となっている。

       _DEFAULT_SOURCE (glibc 2.19 以降)
              このマクロを使うと、「デフォルト」が無効になるような場合でも「デフォルト」の定義が
              提供されるようにすることができる。「デフォルト」が無効になるような状況は、個別のマ
              クロが明示的に定義された場合や、コンパイラが「標準」モードのいずれか        (例えば
              cc -std=c99) で起動された場合などである。他の個々のマクロが定義されず、コンパイラも
              「標準」モードのいずれかを指定して起動されていない場合は、 _DEFAULT_SOURCE を定義し
              ても何の効果もない。

              「デフォルト」定義は、 POSIX.1-2008 で必須となっている定義と、 BSD と System V 由来
              の種々の定義を公開する。  glibc 2.19 以前では、これらのデフォルトは以下を明示的に定
              義するのとほぼ等価である。

                  cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809

       _ATFILE_SOURCE (glibc 2.4 以降)
              このマクロを定義すると (値に関わらず) ヘッダーファイルで 名前の末尾が "at" の各種の
              関数の定義が公開される。  openat(2) 参照。 glibc 2.10 以降では、 _POSIX_C_SOURCE が
              200809L 以上の値で定義された場合には、 このマクロも暗黙のうちに定義される。

       _GNU_SOURCE
              このマクロを定義すると     (値に関わらず)     以下のマクロが暗黙のうちに定義される:
              _ATFILE_SOURCE,    _LARGEFILE64_SOURCE,   _ISOC99_SOURCE,   _XOPEN_SOURCE_EXTENDED,
              _POSIX_SOURCE, 値 200809L の _POSIX_C_SOURCE (バージョン 2.10 より前の glibc では値
              は 200112L、 バージョン 2.5 より前の glibc では値は 199506L、 バージョン 2.1 より前
              の glibc では値は 199309L), 値 700 の _XOPEN_SOURCE (バージョン 2.10 より前の glibc
              では値は 600、 バージョン 2.2 より前の glibc では値は 500)。

              glibc 2.19 以降では、 _GNU_SOURCE を定義すると、 _DEFAULT_SOURCE も暗黙のうちに定義
              される。  バージョン  2.20  より前の  glibc   では、   _GNU_SOURCE   を定義すると、
              _BSD_SOURCE_SVID_SOURCE も暗黙のうちに定義されていた。

       _REENTRANT
              このマクロを定義すると、いくつかのリエントラント  (再入可能)  な関数 定義が公開され
              る。マルチスレッドプログラムでは、この代わりに cc -pthread を使用すること。

       _THREAD_SAFE
              _REENTRANT の同義語。 他のいくつかの実装との互換性を提供するためのもの。

       _FORTIFY_SOURCE (glibc 2.3.4 以降)
              このマクロを定義すると、文字列やメモリーの操作を行う様々な関数を使用する際にバッ
              ファーオーバーフローを検出するための軽めのチェックが実行されるようになる。すべての
              バッファーオーバーフローが検出されるわけではなく、あくまでよくある例についてだけで
              ある。

              ついてだけである。 現在の実装では、以下の関数にチェックが追加されている: 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)
              で利用できる。

   デフォルトの定義、暗黙の定義、組み合わせ定義
       機能検査マクロが一つも明示的に定義されなかった場合、            デフォルトで機能検査マクロ
       _BSD_SOURCE (glibc 2.19 以前), _SVID_SOURCE (glibc 2.19 以前), _DEFAULT_SOURCE (glibc 2.19
       以降), _POSIX_SOURCE, _POSIX_C_SOURCE=200809L が定義される (バージョン 2.10 より前の glibc
       では値は 200112L、 バージョン 2.4 より前の glibc では値は 199506L、 バージョン 2.1  より前
       の glibc では値は 199309L)。

       __STRICT_ANSI__,    _ISOC99_SOURCE,    _POSIX_SOURCE,    _POSIX_C_SOURCE,   _XOPEN_SOURCE,
       _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE (glibc 2.19 以前), _SVID_SOURCE (glibc 2.19 以前) のい
       ずれかが明示的に定義された場合、  _BSD_SOURCE, _SVID_SOURCE, _SVID_SOURCE はデフォルトでは
       定義されない。

       _POSIX_SOURCE_POSIX_C_SOURCE が明示的に定義されない場合で、 __STRICT_ANSI__ が定義され
       ない、もしくは _XOPEN_SOURCE が 500 以上の値で定義されたときには、

       *  _POSIX_SOURCE が値 1 で定義され、かつ

       *  _POSIX_C_SOURCE は以下の値のいずれか一つで定義される。

          ·  2 (_XOPEN_SOURCE が 500 未満の値で定義された場合)

          ·  199506L (_XOPEN_SOURCE が 500 以上 600 未満の値で定義された場合)

          ·  (glibc 2.4 以降)  200112L (_XOPEN_SOURCE が 600 以上 700 未満の値で定義された場合)

          ·  (glibc 2.10 以降)  200809L (_XOPEN_SOURCE が 700 以上の値で定義された場合)

          ·  古いバージョンの  glibc  では _POSIX_C_SOURCE の値として 200112L や 200809L は存在せ
             ず、 _POSIX_C_SOURCE の値がどうなるかは glibc のバージョンにより異なる。

          ·  _XOPEN_SOURCE が未定義の場合、 _POSIX_C_SOURCE の値は  glibc  のバージョンにより異な
             る。  バージョン  2.4 より前の glibc では 199506L、 バージョン 2.4 以降 2.9 未満では
             200112L、 glibc 2.10 以降では 200809L となる。

       また、複数のマクロを定義することもできる。 この場合、定義したマクロはすべて有効になる。

準拠

       POSIX.1   では   _POSIX_C_SOURCE,    _POSIX_SOURCE,    _XOPEN_SOURCE    が規定されている。
       _XOPEN_SOURCE_EXTENDED は XPG4v2 (別名 SUSv1) で規定されていた。

       _FILE_OFFSET_BITS はどの標準でも規定されていないが、 他のいくつかの実装で採用されている。

       _BSD_SOURCE,  _SVID_SOURCE, _DEFAULT_SOURCE, _ATFILE_SOURCE, _GNU_SOURCE, _FORTIFY_SOURCE,
       _REENTRANT, _THREAD_SAFE は Linux (glibc) 固有である。

注意

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

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

       下記のプログラムを使うと、各種の機能検査マクロが glibc のバージョン に応じてどのように設定
       されるかや、どの機能検査マクロが明示的に  設定されるか、を調べることができる。  以下に示す
       シェルセッションは、 glibc 2.10 のシステムでの実行結果の例である。

           $ cc ftm.c
           $ ./a.out
           _POSIX_SOURCE defined
           _POSIX_C_SOURCE defined: 200809L
           _BSD_SOURCE defined
           _SVID_SOURCE defined
           _ATFILE_SOURCE defined
           $ cc -D_XOPEN_SOURCE=500 ftm.c
           $ ./a.out
           _POSIX_SOURCE defined
           _POSIX_C_SOURCE defined: 199506L
           _XOPEN_SOURCE defined: 500
           $ cc -D_GNU_SOURCE ftm.c
           $ ./a.out
           _POSIX_SOURCE defined
           _POSIX_C_SOURCE defined: 200809L
           _ISOC99_SOURCE defined
           _XOPEN_SOURCE defined: 700
           _XOPEN_SOURCE_EXTENDED defined
           _LARGEFILE64_SOURCE defined
           _BSD_SOURCE defined
           _SVID_SOURCE defined
           _ATFILE_SOURCE defined
           _GNU_SOURCE defined

   プログラムのソース

       /* ftm.c */

       #include <stdio.h>
       #include <unistd.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
       #ifdef _POSIX_SOURCE
           printf("_POSIX_SOURCE defined\n");
       #endif

       #ifdef _POSIX_C_SOURCE
           printf("_POSIX_C_SOURCE defined: %ldL\n", (long) _POSIX_C_SOURCE);
       #endif

       #ifdef _ISOC99_SOURCE
           printf("_ISOC99_SOURCE defined\n");
       #endif

       #ifdef _ISOC11_SOURCE
           printf("_ISOC11_SOURCE defined\n");
       #endif

       #ifdef _XOPEN_SOURCE
           printf("_XOPEN_SOURCE defined: %d\n", _XOPEN_SOURCE);
       #endif

       #ifdef _XOPEN_SOURCE_EXTENDED
           printf("_XOPEN_SOURCE_EXTENDED defined\n");
       #endif

       #ifdef _LARGEFILE64_SOURCE
           printf("_LARGEFILE64_SOURCE defined\n");
       #endif

       #ifdef _FILE_OFFSET_BITS
           printf("_FILE_OFFSET_BITS defined: %d\n", _FILE_OFFSET_BITS);
       #endif

       #ifdef _BSD_SOURCE
           printf("_BSD_SOURCE defined\n");
       #endif

       #ifdef _SVID_SOURCE
           printf("_SVID_SOURCE defined\n");
       #endif

       #ifdef _DEFAULT_SOURCE
           printf("_DEFAULT_SOURCE defined\n");
       #endif

       #ifdef _ATFILE_SOURCE
           printf("_ATFILE_SOURCE defined\n");
       #endif

       #ifdef _GNU_SOURCE
           printf("_GNU_SOURCE defined\n");
       #endif

       #ifdef _REENTRANT
           printf("_REENTRANT defined\n");
       #endif

       #ifdef _THREAD_SAFE
           printf("_THREAD_SAFE defined\n");
       #endif

       #ifdef _FORTIFY_SOURCE
           printf("_FORTIFY_SOURCE defined\n");
       #endif

           exit(EXIT_SUCCESS);
       }

関連項目

       libc(7), standards(7)

       info libc の "Feature Test Macros" の節。

       /usr/include/features.h

この文書について

       この  man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。