前へ | 次へ | 目次 | 索引 |
次の例では,OpenVMS VAX システムで HP C のみのプログラムまたは HP C++ のみのプログラムを HP C RTL とリンクするための複数の方法を示します。
$ CC/DECC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1 $ LINK PROG1 |
リンカは自動的に IMAGELIB.OLB から DECC$SHR.EXE を検索します。
$ CC/DECC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1 $ LINK/NOSYSSHR PROG1, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS $ LINK/NOSYSSHR PROG1, SYS$LIBRARY:DECCRTL.OLB - _$ /LIBRARY/INCL=(CMA$TIS,CMA$TIS_VEC) (OpenVMS V7.3 and higher) |
ユーザ・プログラム内で接頭語の付いた HP C RTL シンボル参照は STARLET.OLB で解決されます。
$ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1 $ LINK PROG1, MYLIB/LIBRARY, - _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY |
ユーザ・プログラム内で接頭語の付いていない HP C RTL シンボル参照は, MYLIB および DECCRTL.OLB で解決されます。接頭語の付いていない名前は, DECC$SHR.EXE で解決された接頭語の付いた名前を参照します。
DECCRTL.OLB,DECCRTLG.OLB, DECCCURSE.OLB の有効な組み合わせとリンクすることができます。これと同じ例で,G-floating 倍精度浮動小数点をサポートするには,次のコンパイルおよび LINK コマンドを使用します。
$ CC/DECC/NOPREFIX_LIBRARY_ENTRIES/FLOAT=G_FLOAT PROG1 $ LINK PROG1, MYLIB/LIBRARY, SYS$LIBRARY:DECCRTLG.OLB/LIBRARY, - _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY |
$ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1 $ LINK/NOSYSSHR PROG1, MYLIB/LIBRARY, - _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY |
1.3.4 VAX C および HP C コードの組み合わせのリンクの例
VAX C コードと HP C コード ( または HP C++ コード ) を組み合わせたプログラムを取り扱わなければならないことがあります。次の例では,OpenVMS VAX システムでこのようなプログラムを HP C RTL とリンクするための複数の方法を示しています。これらの例は 第 1.3.3 項 の例に対応しています。
$ CC/DECC PROG1 $ CC/VAXC PROG2 $ LINK PROG1, PROG2, TT:/OPTIONS SYS$LIBRARY:VAXC2DECC.EXE/SHARE [Ctrl/Z] |
PROG1 からの接頭語の付いた C RTL 呼び出しは, DECC$SHR で解決されます。PROG2 からの接頭語のない C RTL 呼び出しは, VAXC2DECC.EXE で解決され,DECC$SHR に転送されます。
$ CC/DECC PROG1 $ CC/VAXC PROG2 $ LINK/NOSYSSHR PROG1, PROG2, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS |
PROG1 と PROG2 の両方からのすべての C RTL 呼び出しは DECCRTL.OLB で解決されます。
$ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1 $ CC/VAXC PROG2 $ LINK PROG1, PROG2, MYLIB/LIBRARY, - _$SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS |
ユーザ・プログラム内の接頭語のない HP C RTL シンボル参照は, MYLIB および DECCRTL.OLB で解決されます。
$ CC/DECC/NOPREFIX_LIBRARY_ENTRIES PROG1 $ CC/VAXC PROG2 $ LINK/NOSYSSHR PROG1, PROG2, MYLIB/LIBRARY, - _$ SYS$LIBRARY:DECCRTL.OLB/LIBRARY /INCL=CMA$TIS |
1.3.5 /NOSYSSHR を使用した VAX C RTL とのリンク
このセクションの説明は, OpenVMS VAX バージョン 6.0 以降で稼動するプログラムに適用されます。
/NOSYSSHR 修飾子を使用して,現在 VAX C RTL オブジェクト・ライブラリとリンクされているプログラムの場合,オブジェクト・ライブラリに対して /INCLUDE=CMA$TIS を指定する必要があります。この修飾子を指定しないと,複数のシンボルが未定義になり,作成されたイメージは実行できません。この修飾子を追加する場合, VAX C RTL オブジェクト・ライブラリとリンクするために LNK$LIBRARY 論理名を使用することはできません。リンカ・オプション・ファイルを使用するか,コマンド・ラインに VAX C RTL オブジェクト・ライブラリの一覧を指定する必要があります。次の例を参照してください。
$ LINK/NOSYSSHR PROG1, SYS$LIBRARY:VAXCRTL.OLB/LIBRARY/INCLUDE=CMA$TIS |
オブジェクト・モジュールをリンクする方法およびヘッダ・ファイルを取り込む方法を学習した後,プログラム内で HP C 関数を参照する方法を学習する必要があります。本書の第 2 章以降では, HP C RTL 関数について詳しく説明します。
1.4.1 関数プロトタイプ
第 2 章以降のどの章でも,各関数を説明する構文は,関数を定義するための標準規約に従っています。この構文を関数プロトタイプ ( または単にプロトタイプ) と呼びます。プロトタイプとは,関数の引数の順序 (引数がある場合),引数の型,関数から返される値の型を簡略に表現したものです。プロトタイプを使用することを推奨します。
関数の戻り値を C データ型キーワードで簡単に表現できない場合は,説明文の中の戻り値の説明を参照してください。プロトタイプの記述では,関数の機能がわかりやすく示されています。しかし,これらの記述にはソース・コードで関数を呼び出す方法が示されていないことがあります。
たとえば, feof関数のプロトタイプについて考えてみましょう。
#include <stdio.h> int feof(FILE *file_ptr); |
プログラムで 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 */ . . . } } |
ライブラリに登録されている関数が使用するパラメータの数は同じではないため,関数プロトタイプの構文の記述は次の規則に従っています。
printfの構文記述について考えてみましょう。
#include <stdio.h> int printf(const char *format_specification, ...); |
printfの構文記述には, 1 つ以上の省略可能なパラメータを指定できることが示されています。
printfのパラメータに関する残りの情報は,関数の説明に示されています。
1.4.3 UNIX 形式のファイル指定
HP C RTL の関数やマクロでは,ファイルを操作することがよくあります。移植性に関する重大な問題の 1 つとして,各システムで使用されるファイル指定が異なるという問題があります。多くの C アプリケーションは UNIX システムとの間で移植されるため,すべてのコンパイラが UNIX システム・ファイル指定を読み込み,解釈できると便利です。
C プログラムを UNIX システムから OpenVMS システムに移植するのに役立つように,次のファイル指定変換関数が HP C RTL に用意されています。
これらのファイル指定変換関数を HP C RTL に取り込むと, UNIX システム・ファイル指定を含む C プログラムを書き直す必要がなくなるという利点があります。 HP C は大部分の有効な UNIX システム・ファイル指定を OpenVMS ファイル指定に変換できます。
UNIX システムと OpenVMS システムのファイル指定の違いだけでなく, RTL がファイルにアクセスする方法の違いについても注意してください。たとえば,RTL は有効な OpenVMS ファイル指定と有効な大部分の UNIX ファイル指定をそれぞれ受け付けますが,この 2 つの組み合わせを受け付けることはできません。 表 1-2 は, UNIX システムと OpenVMS システムのファイル指定の区切り文字の違いを示しています。
説明 | OpenVMS システム | UNIX システム |
---|---|---|
ノード区切り文字 | :: | !/ |
デバイス区切り文字 | : | / |
ディレクトリ・パス区切り文字 | [ ] | / |
サブディレクトリ区切り文字 | [ . ] | / |
ファイル拡張区切り文字 | . | . |
ファイル・バージョン区切り文字 | ; | 適用されない |
たとえば, 表 1-3 は, 2 つの有効な指定と 1 つの無効な指定の形式を示しています。
システム | ファイル指定 | 有効/無効 |
---|---|---|
OpenVMS | BEATLE::DBA0:[MCCARTNEY]SONGS.LIS | 有効 |
UNIX | beatle!/usr1/mccartney/songs.lis | 有効 |
--- | BEATLE::DBA0:[MCCARTNEY.C]/songs.lis | 無効 |
HP C がファイル指定を変換する場合, OpenVMS システムと UNIX システムの両方のファイル指定を検索します。したがって, HP C が UNIX システムのファイル指定を変換する方法と, UNIX システムが同じ UNIX ファイル指定を変換する方法には違いがあることがあります。
たとえば, 表 1-3 に示すように 2 種類のファイル指定の方法を組み合わせた場合, HP C RTL は [MCCARTNEY.C]/songs.lis を [MCCARTNEY]songs.lis または [C]songs.lis として解釈する可能性があります。したがって, HP C が複合ファイル指定を検出すると,エラーが発生します。
UNIX システムでは,デバイス名,ディレクトリ名,ファイル名に対して同じ区切り文字を使用します。このように UNIX ファイル指定にはあいまいさがあるため, HP C はユーザの期待どおりに有効な UNIX システムのファイル指定を変換できないことがあります。
たとえば, /bin/todayを OpenVMS システムの形式で表現すると, [BIN]TODAY または [BIN.TODAY] になります。 HP C は存在するファイルからだけ正しい解釈を行うことができます。ファイル指定で 1 つのファイルまたはディレクトリに対して UNIX システムのファイル名構文が使用されている場合,次の条件のいずれかが満たされれば,対応する OpenVMS のファイル名に変換されます。
UNIX システム環境では,数値のファイル記述子を使用してファイルを参照します。ファイル記述子の中には,標準 I/O デバイスを参照するものと,実際のファイルを参照するものがあります。ファイル記述子がオープンされていないファイルに属す場合は, HP C RTL はそのファイルをオープンします。 HP C は次の OpenVMS 論理名を使用してファイル記述子を評価します。
ファイル記述子 | OpenVMS の論理名 | 意味 |
---|---|---|
0 | SYS$INPUT | 標準入力 |
1 | SYS$OUTPUT | 標準出力 |
2 | SYS$ERROR | 標準エラー |
ODS-5 ボリューム構造では,UNIX 形式と OpenVMS 形式が混在したファイル名のサポート機能が拡張されました。長いファイル名がサポートされるようになり,ファイル名でこれまでより広範囲にわたる文字を使用できるようになり,ファイル名で大文字と小文字の区別が保持されるようになりました。 OpenVMS Alpha バージョン 7.3-1 では, C RTL は ODS-5 文字のサポートを大幅に向上しており,これまでは 214 文字しかサポートされなかったのに対し, 256 文字中,250 文字をサポートするようになりました。また,ファイル・タイプのないファイル名にもアクセスできるようになりました。
新しいサポートを有効にするには, 1 つ以上の C RTL 機能論理名を定義する必要があります。これらの名前は次のとおりです。
DECC$EFS_CHARSET
DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION
DECC$FILENAME_UNIX_NO_VERSION
DECC$FILENAME_UNIX_REPORT
DECC$READDIR_DROPDOTNOTYPE
DECC$RENAME_NO_INHERIT
これらの機能論理名や他の機能論理名の詳細については, 第 1.6 節 を参照してください。
前へ | 次へ | 目次 | 索引 |