HP OpenVMS HP C ランタイム・ライブラリ・リファレンス・マニュアル (上巻)
第 1 章 はじめに
ISO/ANSI C 標準では,ANSI C の実装で提供される関数,マクロ,関連する型を登録したライブラリを定義しています。『HP C Language Reference Manual』では,すべての HP C プラットフォームに共通の ANSI 準拠のライブラリの機能について説明しています。『HP C ランタイム・ライブラリ・リファレンス・マニュアル』では,これらのルーチンについてさらに詳しく説明し, OpenVMS 環境でこれらのルーチンを使用する方法についても説明します。また,OpenVMS システムで提供される追加のヘッダ・ファイル,関数,型,マクロについても説明します。
すべてのライブラリ関数はヘッダ・ファイルで宣言されます。ヘッダ・ファイルの内容をプログラムで使用できるようにするには,
#includeプリプロセッサ・ディレクティブを使用してヘッダ・ファイルを取り込みます。次の例を参照してください。
各ヘッダ・ファイルには,関連する関数の集合に対する関数プロトタイプが格納されており,これらの関数を使用するのに必要な型とマクロを定義しています。
OpenVMS Alpha または Integrity システムでヘッダ・ファイルの一覧を表示するには,次のコマンドを使用します。
$ LIBRARY/LIST SYS$LIBRARY:SYS$STARLET_C.TLB
$ LIBRARY/LIST SYS$LIBRARY:DECC$RTLDEF.TLB
$ DIR SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF]*.H;
$ DIR SYS$LIBRARY:*.H;
|
最初のコマンドは,OpenVMS システム・インタフェースのヘッダ・ファイルのテキスト・モジュール形式を一覧表示します。 2 番目のコマンドは, HP C 言語インタフェースのヘッダ・ファイルのテキスト・モジュール形式を一覧表示します。 3 番目のコマンドは, HP C 言語イタンフェースの *.H ヘッダ・ファイルを一覧表示します。 4 番目のコマンドは,レイヤード・プロダクトおよび他のアプリケーションの *.H ヘッダ・ファイルを一覧表示します。
| 注意
SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF] ディレクトリは,表示のための単なる参照領域です。
#includeでファイルを検索する場合,コンパイラは *.TLB ファイルを確認します。
|
しかし, SYS$LIBRARY から検索される重複ファイル (
<stdio.h>など) は,おそらく VAX C Version 3.2 環境をサポートするものであり, HP C では使用されません。
関数定義自体がヘッダ・ファイルに含まれているわけではなく,これらの定義は OpenVMS オペレーティング・システムに付属している HP C Run-Time Library (RTL) に格納されています。 HP C RTL を使用する前に,次のことを十分理解しておく必要があります。
- リンク・プロセス
- マクロ置換プロセス
- 関数定義と関数呼び出しの違い
- 正しいファイル指定の形式
- OpenVMS 固有の入出力 (I/O) の方法
- HP C for OpenVMS の拡張機能と非標準機能
HP C RTL を効果的に使用するには,これらのすべてのトピックに関する知識が必要です。この章では,これらのトピックと HP C RTL との関連を示します。本書の他の章を読む前に,この章を必ずお読みください。
HP C RTL の基本的な目的は, C プログラムで I/O 操作を実行するための手段を提供することです。 C 言語自体には情報の読み書き機能はありません。 I/O のサポートの他に, HP C RTL では他の多くの作業を実行する手段も提供されます。
第 2 〜 11 章では, HP C RTL でサポートされるさまざまなタスクについて説明します。「リファレンス・セクション」では,これらのタスクを実行するために提供されるすべての関数とマクロをアルファベット順に示し,詳しく説明します。
HP C RTL を使用する場合,実装固有の特徴を理解しておく必要があります。
まず,C プログラムで HP C RTL の関数を使用する場合,
mainという名前の関数,または
main_programオプションを使用する関数がプログラム内に存在することを確認してください。詳細については,『HP C Language Reference Manual』または『HP C User's Guide for OpenVMS Systems』を参照してください。
次に, HP C RTL 関数は実行時に実行されますが,これらの関数に対する参照はリンク時に解決されます。プログラムをリンクすると,OpenVMS リンカは, LINK コマンド・ラインに指定された共用可能コード・ライブラリやオブジェクト・コード・ライブラリを検索することにより, HP C RTL 関数に対するすべての参照を解決します。
HP C RTL は共用可能イメージとして使用でき, HP C RTL オブジェクト・ライブラリを使用することもできます。
HP C RTL を共用可能イメージとして使用する場合, RTL のコードは SYS$SHARE 内のイメージ・ファイルに存在し,すべての HP C プログラムで共用されます。実行後,制御はユーザ・プログラムに返されます。このプロセスには次のような多くの利点があります。
- プログラムの実行可能イメージのサイズが小さくなります。
- プログラムのイメージが使用するディスク空間が少なくなります。
- サイズが小さくなるため,メモリとの間のプログラムのスワップ速度が向上します。
- HP C および HP C++ を使用すれば,共用可能イメージに対してプログラムをリンクするときにオプション・ファイルを定義する必要はありません。RTL 共用可能イメージに対するリンクは, VAX C の場合よりはるかに簡単になりました。実際に,このリンクは HP C RTL へのリンクのデフォルト方式になっています。
HP C RTL にリンクする場合, LNK$LIBRARY 論理名を定義する必要はありません。実際には,共用可能イメージとのリンクの方が HP C RTL オブジェクト・ライブラリとのリンクより便利であるため, LNK$LIBRARY の割り当ては解除する必要があります。
HP C RTL とのリンクに関する補足情報については,OpenVMS, HP C ,HP C++ のリリース・ノートを参照してください。
ここでは,OpenVMS Alpha システムと OpenVMS Integrity システムで HP C および HP C++ プログラムを HP C RTL とリンクする複数の方法について説明します。
1.2.1 共用可能イメージとのリンク | |
ほとんどのリンクでは,ALPHA$LIBRARY ディレクトリ (Alpha only) または IA64$LIBRARY
(Integrity only) ディレクトリ内の HP C RTL 共用可能イメージ DECC$SHR.EXE を使用します。
共用可能イメージ VAXCRTL.EXE および VAXCRTLG.EXE は, OpenVMS Alpha と OpenVMS Integrity システムにはありません。唯一の C RTL 共用可能イメージは ALPHA$LIBRARY:DECC$SHR.EXE
(Alpha only) または IA64$LIBRARY:DECC$SHR.EXE (Integrity only) であり,リンカは IMAGELIB.OLB を通じて自動的にこのイメージを検索します。
VAXCRTL*.EXE は Alpha システムと Integrity システムに存在しないため,次のことに注意する必要があります。
- VAXCRTL*.EXE イメージに対する参照を除外するために,既存の VAX C リンク・プロシージャを変更する必要があります。 IMAGELIB.OLB はリンカによって自動的に検索されるため, DECC$SHR.EXE を明示的に参照する必要はありません ( 『OpenVMS Linker Utility Manual』を参照)。
- DECC$SHR.EXE は接頭語の付いたユニバーサル・シンボル (DECC$ から始まるシンボル) だけをエクスポートするので,正しくリンクするには,使用するすべての HP C RTL エントリ・ポイントに対して接頭語を付ける必要があります。
ANSI C 標準に定義されている HP C RTL 関数だけを使用する場合は,すべてのエントリ・ポイントに接頭語が付加されます。 ANSI C 標準に定義されていない HP C RTL 関数を使用する場合は,次のいずかの方法でコンパイルすることにより,接頭語を付加する必要があります。
- /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES 修飾子を指定してコンパイルする方法。
- /STANDARD=VAXC または /STANDARD=COMMON 修飾子を指定してコンパイルする方法。デフォルトは /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES です。
共用可能イメージに対してリンクするには,LINK コマンドを使用します。次の例を参照してください。
リンカは自動的に IMAGELIB.OLB から DECC$SHR.EXE を検索し,すべての C RTL 参照を解決します。
1.2.2 オブジェクト・ライブラリとのリンク (Alpha only) | |
OpenVMS Alpha システムの HP C RTL オブジェクト・ライブラリは, /PREFIX=ALL を使用せずにコンパイルされたプログラムをリンクする場合にだけ使用します。これらのオブジェクト・ライブラリは,OpenVMS Integrity システムには存在しない点に注意してください。
OpenVMS Alpha システムでは, HP C RTL は ALPHA$LIBRARY ディレクトリに次のオブジェクト・ライブラリを提供します。
- VAXCCURSE.OLB
- VAXCRTLD.OLB
- VAXCRTLT.OLB
- VAXCRTL.OLB
- VAXCRTLX.OLB
- VAXCRTLDX.OLB
- VAXCRTLTX.OLB
Curses 関数へのアクセスを可能にするオブジェクト・ライブラリ VAXCCURSE.OLB には,接頭語のないエントリ・ポイントが含まれており,これらのエントリ・ポイントは接頭語の付いた適切なエントリ・ポイントに変換されます。
オブジェクト・ライブラリ VAXCRTL.OLB,VAXCRTLD.OLB,VAXCRTLT.OLB, VAXCRTLX.OLB,VAXCRTLDX.OLB,VAXCRTLTX.OLB には,使用するオブジェクト・ライブラリに指定されている浮動小数点型に応じて,適切な接頭語の付いたエントリ・ポイントに変換される接頭語のないエントリ・ポイントも含まれています。
- VAXCRTL.OLB には,すべての HP C RTL ルーチン名エントリ・ポイントの他に, VAX G-floating 倍精度浮動小数点エントリ・ポイントも含まれています。
- VAXCRTLD.OLB には,VAX D-floating 倍精度浮動小数点エントリ・ポイントの限定サポートが含まれています。
- VAXCRTLT.OLB には, IEEE T-floating 倍精度浮動小数点エントリ・ポイントが含まれています。
- VAXCRTLX.OLB には,G_floating のサポートと, /L_DOUBLE_SIZE=128 コンパイラ修飾子のサポートが含まれています。
- VAXCRTLDX.OLB には,D_floating のサポートと, /L_DOUBLE_SIZE=128 コンパイラ修飾子のサポートが含まれています。
- VAXCRTLTX.OLB には,IEEE T_floating のサポートと, /L_DOUBLE_SIZE=128 コンパイラ修飾子のサポートが含まれています。
/L_DOUBLE_SIZE=128 がデフォルトです。
LINK コマンドには,VAXCRTL*.OLB ライブラリを 1 つだけ指定し,必要に応じて VAXCCURSE.OLB ライブラリも指定します。
コンパイラのデフォルト・モード (/STANDARD=RELAXED_ANSI89) および厳密な ANSI C モードでは, ANSI C 標準ライブラリ・ルーチンに対するすべての呼び出しに,接頭語 DECC$ が自動的に付加されます。 /[NO]PREFIX_LIBRARY_ENTRIES 修飾子を使用すると,この動作を変更して,すべての HP C RTL の名前に DECC$ という接頭語を付けるか, HP C RTL の名前に接頭語を付けないようにすることができます。この修飾子には他のオプションも用意されています。詳細については,この章の /[NO]PREFIX_LIBRARY_ENTRIES 修飾子の説明を参照してください。
/NOSYSSHR を使用してリンクするときに, HP C RTL ルーチンの呼び出しに DECC$ という接頭語を付ける場合,リンクが必要なのは STARLET.OLB 内のモジュールだけです。 STARLET.OLB はリンカで自動的に検索されるため ( リンク修飾子 /NOSYSLIB を使用しない限り ),接頭語の付いたすべての RTL 外部名は自動的に解決されます。
HP C RTL ルーチンの呼び出しに接頭語を付けない場合は,必要な浮動小数点型に応じて,あるいは Curses 関数が必要かどうかに応じて, VAXCRTL.OLB,VAXCRTLD.OLB,VAXCRTLT.OLB ( または VAXCRTLX.OLB,VAXCRTLDX.OLB,VAXCRTLDX.OLB), VAXCCURSE.OLB のいずれかに対して明示的にリンクする必要があります。 /NOSYSSHR を使用してリンクする場合は,接頭語の付いた HP C RTL エントリ・ポイントは STARLET.OLB で解決されます。 /SYSSHR (デフォルト) を使用してリンクする場合は,接頭語の付いた HP C RTL エントリ・ポイントは DECC$SHR.EXE で解決されます。
1.2.3 例 | |
次の例では, HP C RTL とリンクするための複数の方法を示しています。
図 1-1 は,これらの例を図でわかりやすく示しています。
- ほとんどの場合,共用可能イメージに対するリンクだけが必要です。
$ CC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
$ LINK PROG1
|
リンカは IMAGELIB.OLB から自動的に DECC$SHR.EXE を検索します。
- オブジェクト・ライブラリだけを使用する場合 ( たとえば,特権付きコードを作成するためや配布を簡単にするため ), LINK コマンドの /NOSYSSHR 修飾子を使用します。
$ CC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
$ LINK/NOSYSSHR PROG1
|
ユーザ・プログラム内で接頭語の付いた RTL シンボル参照は,STARLET.OLB に含まれる HP C RTL オブジェクト・ライブラリで解決されます。
| 注意
- /NOSYSSHR 修飾子を使用して, HP C プログラムを HP C RTL オブジェクト・ライブラリに対してリンクする場合,未定義グローバルを含まずにすでにリンクされているアプリケーションでは, CMA$TIS シンボルの未定義グローバルが発生することがあります。これらの未定義グローバルを解決するには,次の行をリンク・オプション・ファイルに追加します。
SYS$LIBRARY:STARLET.OLB/LIBRARY/INCLUDE=CMA$TIS
|
- /NOSYSSHR 修飾子を使用してリンクしたプログラムで,動的に起動されるイメージ内に常駐するルーチンを呼び出し,そのルーチンが異常終了状態を示す値を返した場合,
errnoは ENOSYS に設定され,
vaxc$errnoは C$_NOSYSSHR に設定されます。 C$_NOSYSSHR に対応するエラー・メッセージは "Linking /NOSYSSHR disables dynamic image activation" です。たとえば,ソケット・ルーチンを呼び出すプログラムを, /NOSYSSHR を使用してリンクすると,このような状況が発生します。
|
- (Alpha only) OpenVMS Alpha システムでは,接頭語を付加しないように設定してコンパイルした場合, C RTL 関数の別の実装を提供するオブジェクト・ライブラリを使用するには, VAXC*.OLB オブジェクト・ライブラリを使用する必要があります。この場合,コンパイルとリンクは次のように行います。
$ CC/NOPREFIX_LIBRARY_ENTRIES PROG1
$ LINK PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLX.OLB/LIBRARY
|
ユーザ・プログラム内で接頭語のない HP C RTL シンボル参照は, MYLIB および VAXCRTL.OLB で解決されます。 VAXCRTLX.OLB 内で接頭語の付いた HP C RTL シンボル参照は, IMAGELIB.OLB を通じて DECC$SHR.EXE で解決されます。
この同じ例で,IEEE T-floating 倍精度浮動小数点をサポートするには,次のコンパイルおよびリンク・コマンドを使用します。
$ CC/NOPREFIX_LIBRARY_ENTRIES/FLOAT=IEEE_FLOAT PROG1
$ LINK PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLTX.OLB/LIBRARY
|
- (Alpha only) 例 2 と例 3 を組み合わせて,オブジェクト・ライブラリ ( 特権付きコードを作成するためや配布を簡単にするため ) だけを使用し, C RTL 関数を提供するオブジェクト・ライブラリを使用しなければならないことがあります。この場合,コンパイルとリンクは次の方法で行います。
$ CC/NOPREFIX_LIBRARY_ENTRIES PROG1
$ LINK/NOSYSSHR PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLX.OLB/LIBRARY
|
VAXCRTL.OLB 内で接頭語の付いた HP C RTL シンボル参照は, STARLET.OLB で解決されます。
図 1-1 OpenVMS Alpha と OpenVMS Integrity での HP C RTL とのリンク
1.2.4 DECC$SHRP.EXE イメージ | |
OpenVMS は,保護モードで必要となる C RTL 関数を実装する新しい共有イメージ DECC$SHRP.EXE をインストールします。この共有イメージはすべての Alpha および Integrity システムにインストールされ, DECC$SHR.EXE あるいは DECC$SHR_EV56.EXE 共有イメージから起動されます。
オブジェクト・モジュールをリンクする方法およびヘッダ・ファイルを取り込む方法を学習した後,プログラム内で HP C 関数を参照する方法を学習する必要があります。本書の第 2 章以降では, HP C RTL 関数について詳しく説明します。
1.3.1 関数プロトタイプ | |
第 2 章以降のどの章でも,各関数を説明する構文は,関数を定義するための標準規約に従っています。この構文を関数プロトタイプ ( または単にプロトタイプ) と呼びます。プロトタイプとは,関数の引数の順序 (引数がある場合),引数の型,関数から返される値の型を簡略に表現したものです。プロトタイプを使用することを推奨します。
関数の戻り値を C データ型キーワードで簡単に表現できない場合は,説明文の中の戻り値の説明を参照してください。プロトタイプの記述では,関数の機能がわかりやすく示されています。しかし,これらの記述にはソース・コードで関数を呼び出す方法が示されていないことがあります。
たとえば,
feof関数のプロトタイプについて考えてみましょう。
#include <stdio.h>
int feof(FILE *file_ptr);
|
この構文は次の情報を示します。
-
feofプロトタイプは
<stdio.h>ヘッダ・ファイルに存在します。
feofを使用するには,このヘッダ・ファイルを取り込む必要があります ( HP C RTL 関数を独自に宣言することは望ましくありません )。
-
feof関数は
int型の値を返します。
- この関数には file_ptr という 1 つの引数があり,データ型は "pointer to FILE" (FILE を指すポインタ) です。 FILE は
<stdio.h>ヘッダ・ファイルに定義されています。
プログラムで
feofを使用するには,次の例に示すように,
feof関数を呼び出す前に,任意の場所で
<stdio.h>を取り込みます。
#include <stdio.h> /* Include Standard I/O */
main()
{
FILE *infile; /* Define a file pointer */
.
.
. /* Call the function feof */
while ( ! feof(infile) ) /* Until EOF reached */
{ /* Perform file operations */
.
.
.
}
}
|
|