library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


OpenVMS

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


前へ 次へ 目次 索引



第 1 章
はじめに

ISO/ANSI C 標準では,ANSI C のインプリメンテーションで提供される関数,マクロ,関連する型を登録したライブラリを定義しています。『HP C Language Reference Manual』では,すべての HP C プラットフォームに共通の ANSI 準拠のライブラリの機能について説明しています。『HP C ランタイム・ライブラリ・リファレンス・マニュアル』では,これらのルーチンについてさらに詳しく説明し, OpenVMS 環境でこれらのルーチンを使用する方法についても説明します。また,OpenVMS システムで提供される追加のヘッダ・ファイル,関数,型,マクロについても説明します。

すべてのライブラリ関数はヘッダ・ファイルで宣言されます。ヘッダ・ファイルの内容をプログラムで使用できるようにするには, #includeプリプロセッサ・ディレクティブを使用してヘッダ・ファイルを取り込みます。次の例を参照してください。


    #include <stdlib.h>    

各ヘッダ・ファイルには,関連する関数の集合に対する関数プロトタイプが格納されており,これらの関数を使用するのに必要な型とマクロを定義しています。

OpenVMS Alpha システムまたは I64 システムでヘッダ・ファイルの一覧を表示するには,次のコマンドを使用します。


$ 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 ファイルを確認します。

OpenVMS VAX システムでヘッダ・ファイルの一覧を表示するには,次のコマンドを使用します。


$ DIR 'F$TRNLMN("DECC$LIBRARY_INCLUDE")'*.H;
$ DIR DECC$LIBRARY_INCLUDE:*.H;

OpenVMS VAX システムでは,次のコマンドは追加ヘッダ・ファイルや重複ヘッダ・ファイルも検索します。


$ DIR SYS$LIBRARY:*.H;

しかし, SYS$LIBRARY から検索される重複ファイル ( <stdio.h>など) は,おそらく VAX C バージョン 3.2 環境をサポートするものであり, HP C では使用されません。

関数定義自体がヘッダ・ファイルに含まれているわけではなく,これらの定義は OpenVMS オペレーティング・システムに付属している HP C Run-Time Library (RTL) に格納されています。 HP C RTL を使用する前に,次のことを十分理解しておく必要があります。

HP C RTL を効果的に使用するには,これらのすべてのトピックに関する知識が必要です。この章では,これらのトピックと HP C RTL との関連を示します。本書の他の章を読む前に,この章を必ずお読みください。

HP C RTL の基本的な目的は, C プログラムで I/O 操作を実行するための手段を提供することです。 C 言語自体には情報の読み書き機能はありません。 I/O のサポートの他に, HP C RTL では他の多くの作業を実行する手段も提供されます。

第 2 〜 11 章では, HP C RTL でサポートされるさまざまなタスクについて説明します。「リファレンス・セクション」では,これらのタスクを実行するために提供されるすべての関数とマクロをアルファベット順に示し,詳しく説明します。

1.1 HP C Run-Time Library の使用

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 RTL にリンクする場合, LNK$LIBRARY 論理名を定義する必要はありません。実際には,共用可能イメージとのリンクの方が HP C RTL オブジェクト・ライブラリとのリンクより便利であるため, LNK$LIBRARY の割り当ては解除する必要があります。

HP C RTL とのリンクに関する補足情報については,OpenVMS, HP C ,HP C++ のリリース・ノートを参照してください。

1.2 Alpha および I64 システムでの RTL リンク・オプション (Alpha, I64)

ここでは,OpenVMS Alpha システムと I64 システムで HP C および HP C++ プログラムを HP C RTL とリンクする複数の方法について説明します。

1.2.1 共用可能イメージとのリンク

ほとんどのリンクでは,ALPHA$LIBRARY ディレクトリ (Alpha only) または IA64$LIBRARY (I64 only) ディレクトリ内の HP C RTL 共用可能イメージ DECC$SHR.EXE を使用します。

共用可能イメージ VAXCRTL.EXE および VAXCRTLG.EXE は, OpenVMS Alpha システムと I64 システムにはありません。唯一の C RTL 共用可能イメージは ALPHA$LIBRARY:DECC$SHR.EXE (Alpha only) または IA64$LIBRARY:DECC$SHR.EXE (I64 only) であり,リンカは IMAGELIB.OLB を通じて自動的にこのイメージを検索します。

VAXCRTL*.EXE は Alpha システムと I64 システムに存在しないため,次のことに注意する必要があります。

共用可能イメージに対してリンクするには,LINK コマンドを使用します。次の例を参照してください。


    $ LINK PROG1    

リンカは自動的に IMAGELIB.OLB から DECC$SHR.EXE を検索し,すべての C RTL 参照を解決します。

1.2.2 オブジェクト・ライブラリとのリンク (Alpha only)

OpenVMS Alpha システムの HP C RTL オブジェクト・ライブラリは, /PREFIX=ALL を使用せずにコンパイルされたプログラムをリンクする場合にだけ使用します。これらのオブジェクト・ライブラリは,OpenVMS I64 システムには存在しない点に注意してください。

OpenVMS Alpha システムでは, HP C RTL は ALPHA$LIBRARY ディレクトリに次のオブジェクト・ライブラリを提供します。

Curses 関数へのアクセスを可能にするオブジェクト・ライブラリ VAXCCURSE.OLB には,接頭語のないエントリ・ポイントが含まれており,これらのエントリ・ポイントは接頭語の付いた適切なエントリ・ポイントに変換されます。

オブジェクト・ライブラリ VAXCRTL.OLB,VAXCRTLD.OLB,VAXCRTLT.OLB, VAXCRTLX.OLB,VAXCRTLDX.OLB,VAXCRTLTX.OLB には,使用するオブジェクト・ライブラリに指定されている浮動小数点型に応じて,適切な接頭語の付いたエントリ・ポイントに変換される接頭語のないエントリ・ポイントも含まれています。

/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 は,これらの例を図でわかりやすく示しています。

  1. ほとんどの場合,共用可能イメージに対するリンクだけが必要です。


    $ CC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK PROG1
    


    リンカは IMAGELIB.OLB から自動的に DECC$SHR.EXE を検索します。

  2. オブジェクト・ライブラリだけを使用する場合 ( たとえば,特権付きコードを作成するためや配布を簡単にするため ), 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 を使用してリンクすると,このような状況が発生します。

  3. (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 
    

  4. (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 と I64 での HP C RTL とのリンク


1.3 VAX システムでの RTL リンク・オプション (VAX only)

VAX C RTL と HP C RTL はどちらも OpenVMS VAX システムに共存できます。 VAX C RTL は既存の VAX C アプリケーションをサポートします。 HP C RTL は ANSI 準拠の HP C と HP C++ をサポートし,OpenVMS 環境の他のコンポーネントもサポートします。 HP C RTL では,スレッド・セーフと性能向上のための機能も提供されます。

VAX C で開発されたアプリケーションは,今後も VAX C RTL を使用します。しかし,代わりに HP C RTL を使用するように VAX C アプリケーションを再リンクすることもできます。このようにすると, HP C RTL の新機能を利用することができ, VAX C RTL と HP C RTL の両方を統合した複雑なアプリケーションで相互運用性に関する問題を解決することができます。 HP C RTL を使用するために再リンクされる既存のアプリケーションは, VAX C RTL と HP C RTL の動作の違いによって問題が発生しないかどうか,注意深くテストしておく必要があります。詳細については,該当する HP C のリリース・ノートと OpenVMS のリリース・ノートを参照してください。

ここでは,OpenVMS VAX システムで HP C プログラムを HP C RTL および VAX C RTL とリンクするための複数の方法について説明します。


前へ 次へ 目次 索引