OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


1.5 ヘッダ・ファイル制御のための機能テスト・マクロ

機能テスト・マクロは,移植可能なプログラムを作成するための手段を提供します。これらのマクロを使用すると,プログラムで使用する HP C RTL シンボル名がインプリメンテーションで提供されるシンボル名と競合しないかどうか確認できます。

HP C RTL のヘッダ・ファイルは,多くの機能テスト・マクロの使用をサポートするようにコーディングされています。アプリケーションで機能テスト・マクロを定義した場合, HP C RTL ヘッダ・ファイルはその機能テスト・マクロで定義されているシンボルとプロトタイプだけを提供し,それ以外のものは提供しません。プログラムでこのようなマクロを定義しないと, HP C RTL ヘッダ・ファイルは無制限にシンボルを定義します。

HP C RTL でサポートされる機能テスト・マクロは,次に示すようにヘッダ・ファイル内のシンボルの有効性を制御するために,大きく 3 種類に分類されます。

1.5.1 標準マクロ

HP C RTL では,次の標準の一部がインプリメントされています。

1.5.2 標準の選択

機能テスト・マクロを定義することにより,各標準を選択することができます。このようにマクロを定義するには,ヘッダ・ファイルを取り込む前に, C ソースで #defineプリプロセッサ・ディレクティブを使用するか, CC コマンド・ラインに /DEFINE 修飾子を指定します。

表 1-4 は,標準のサポートを制御する HP C RTL 機能テスト・マクロを示しています。

表 1-4 機能テスト・マクロ---標準
マクロ名 選択される標準 暗黙に選択される他の標準 説明
_XOPEN_SOURCE_EXTENDED XPG4 V2 XPG4,ISO POSIX-2,ISO POSIX-1,ANSI C 以前は X/Open で採用されていなかった従来の UNIX ベースのインタフェースも含めて, XPG4 拡張機能が有効になる。
_XOPEN_SOURCE XPG4 ISO POSIX-2,ISO POSIX-1,ANSI C XPG4 標準シンボルが有効になり, _POSIX_C_SOURCE が 2 より大きい値に定義されていない場合は, 2 に設定される 1 2
_POSIX_C_SOURCE ==199506 IEEE 1003.1c-1995 ISO POSIX-2,ISO POSIX-1,ANSI C ANSI C によって定義されるヘッダ・ファイルで, IEEE 1003.1c-1995 によって要求されるシンボルが有効になる。
_POSIX_C_SOURCE ==2 ISO POSIX-2 ISO POSIX-1,ANSI C ANSI C によって定義されるヘッダ・ファイルで, ISO POSIX-2 によって要求されるシンボルの他に, ISO POSIX-1 によって要求されるシンボルも有効になる。
_POSIX_C_SOURCE ==1 ISO POSIX-1 ANSI C ANSI C によって定義されるヘッダ・ファイルで, ISO POSIX-1 によって要求されるシンボルが有効になる。
__STDC_VERSION__ ==199409 ISO C amdt 1 ANSI C ISO C Amendment 1 シンボルが有効になる。
_ANSI_C_SOURCE ANSI C --- ANSI C 標準のシンボルが有効になる。


1ISO C Amendment 1 には, XPG4 に指定されていないシンボルが含まれており, __STDC_VERSION__ == 199409 および _XOPEN_SOURCE (または _XOPEN_SOURCE_EXTENDED) を定義すると, ISO C と XPG4 API の両方が選択される。 XPG4 と ISO C Amendment 1 の両方を指定してコンパイルしたときに競合が発生した場合, ISO C Amendment 1 が優先される。
2XPG4 は ISO C Amendment 1 を拡張したものである。 _XOPEN_SOURCE または _XOPEN_SOURCE_EXTENDED を定義すると, ISO C API の他に,ヘッダ・ファイルで提供される XPG4 拡張機能も選択される。このコンパイル・モードでは,XPG4 拡張機能が有効になる。

ここに示した標準のいずれでも定義されていない機能は HP C 拡張機能であると解釈され,標準関連の機能テスト・マクロを定義しないことによって選択されます。

ヘッダ・ファイル定義を制御するために機能テスト・マクロを明示的に定義しなかった場合は, HP C 拡張機能も含めて,定義されているすべてのシンボルが暗黙に取り込まれます。

1.5.3 /STANDARD 修飾子との相互関係

/STANDARD 修飾子はサポートされる C 言語の方言を選択します。

/STANDARD=ANSI89 および /STANDARD=ISOC94 を除き, C 言語の方言の選択と使用する HP C RTL API の選択はそれぞれ独立して行われます。 /STANDARD に対して他の値を選択すると,拡張機能も含めて API 全体が使用可能になります。

/STANDARD=ANSI89 を指定すると,デフォルト API セットは ANSI C セットに制限されます。この場合,より広範囲にわたる API セットを選択するには,適切な機能テスト・マクロも指定する必要があります。拡張機能も含めて, ANSI C の方言とすべての API を選択するには,ヘッダ・ファイルを取り込む前に, __HIDE_FORBIDDEN_NAMESの定義を取り消します。

/STANDARD=ISOC94 を使用してコンパイルすると, __STDC_VERSION__は 199409 に設定されます。 XPG4 と ISO C Amendment 1 の両方を指定してコンパイルしたときに競合が発生した場合は, ISO C Amendment 1 が優先されます。 ISO C Amendment 1 に対する XPG4 拡張機能を選択するには, _XOPEN_SOURCEを定義します。

次の例はこれらの規則を理解するのに役立ちます。

1.5.4 複数バージョン・サポート・マクロ

デフォルト設定では,ヘッダ・ファイルは,コンパイルが行われるオペレーティング・システムのバージョンによって提供される HP C RTL 内の API を有効にします。この処理は,『HP C User's Guide for OpenVMS Systems』に説明しているように, __VMS_VERマクロの定義済み設定によって行われます。たとえば,OpenVMS バージョン 6.2 でコンパイルすると,バージョン 6.2 およびそれより前のバージョンの HP C RTL API だけが使用可能になります。

__VMS_VERマクロの別の使用例として, OpenVMS Alpha バージョン 7.0 以降で提供される HP C RTL 関数の 64 ビット・バージョンのサポートがあります。すべてのヘッダ・ファイルで,64 ビットをサポートする関数は, __VMS_VERが OpenVMS バージョン 7.0 以降であることを示す場合にだけ有効になるように条件化されています。

オペレーティング・システムの以前のバージョンを対象にするには,次の操作を行います。

  1. DECC$SHR の古いバージョンを指すように論理名 DECC$SHR を定義します。コンパイラは DECC$SHR のテーブルを使用してルーチン名に接頭語を付ける処理を実行します。

  2. /DEFINE 修飾子を使用するか, #undef#defineプリプロセッサ・ディレクティブの組み合わせを使用して, __VMS_VERを適切に定義します。/DEFINE 修飾子を使用する場合は,定義済みマクロの再定義に関する警告を無効にする必要があるかもしれません。

オペレーティング・システムの新しいバージョンを対象にする操作は,常に可能なわけではありません。一部のバージョンでは,まだ存在しないオペレーティング・システムの新機能が新しい DECC$SHR.EXE で要求されることがあります。このようなバージョンでは,ステップ 1 で論理名 DECC$SHR を定義すると,コンパイル・エラーになります。

__VMS_VERの値を上書きするには,コンパイラのコマンド・ラインで __VMS_VER_OVERRIDEを定義します。値を指定せずに __VMS_VER_OVERRIDEを定義すると, __VMS_VERは最大値に設定されます。

1.5.5 互換性モード

次の定義済みマクロは,DEC C の以前のバージョンまたは OpenVMS オペレーティング・システムの以前のバージョンとのヘッダ・ファイルの互換性を選択するために使用します。

ヘッダ・ファイルでは,次の 2 種類の非互換性を制御できます。

次の例はこれらのマクロの使い方を理解するのに役立ちます。


前へ 次へ 目次 索引