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


前へ 次へ 目次 索引


1.3.3 HP C または HP C++ コードのみのリンクの例

次の例では,OpenVMS VAX システムで HP C のみのプログラムまたは HP C++ のみのプログラムを HP C RTL とリンクするための複数の方法を示します。

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


    $ CC/DECC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK PROG1
    


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

  2. オブジェクト・ライブラリだけを使用する場合 ( たとえば特権付きコードを作成するためや配布を簡単にするため ), LINK コマンドの /NOSYSSHR 修飾子を使用します。


    $ 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 で解決されます。

  3. 接頭語の付加を無効にしてコンパイルした場合,C RTL 関数の別のインプリメンテーションを提供するオブジェクト・ライブラリを使用するには, DECC*.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
    

  4. 例 2 と例 3 を組み合わせて,オブジェクト・ライブラリだけを使用し ( 特権付きコードを作成するためや配布を簡単にするため ), C RTL 関数を提供するオブジェクト・ライブラリを使用しなければならないことがあります。この場合,コンパイルとリンクは次の方法で行います。


    $ 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 項 の例に対応しています。

  1. 共用可能イメージに対してリンクするには, VAXC2DECC.EXE 共用可能イメージを指定します。


    $ 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 に転送されます。

  2. オブジェクト・ライブラリだけを使用する場合は ( たとえば,特権付きコードを作成するためや配布を簡単にするため ), LINK コマンドの /NOSYSSHR 修飾子を使用します。


    $ CC/DECC PROG1
    $ CC/VAXC PROG2
    $ LINK/NOSYSSHR PROG1, PROG2, SYS$LIBRARY:DECCRTL.OLB/LIBRARY/INCL=CMA$TIS
    


    PROG1 と PROG2 の両方からのすべての C RTL 呼び出しは DECCRTL.OLB で解決されます。

  3. 接頭語の付加を無効にしてコンパイルした場合, C RTL 関数の別のインプリメンテーションを提供するオブジェクト・ライブラリを使用するには, DECC*.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 で解決されます。

  4. 例 2 と例 3 を組み合わせて,オブジェクト・ライブラリだけを使用し ( 特権付きコードを作成するためや配布を簡単にするため ), C RTL 関数を提供するオブジェクト・ライブラリを使用しなければならないことがあります。この場合,コンパイルとリンクは次の方法で行います。


    $ 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

1.4 HP C RTL 関数プロトタイプと構文

オブジェクト・モジュールをリンクする方法およびヘッダ・ファイルを取り込む方法を学習した後,プログラム内で 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  */ 
          . 
          . 
          . 
       } 
} 

1.4.2 関数プロトタイプの構文規則

ライブラリに登録されている関数が使用するパラメータの数は同じではないため,関数プロトタイプの構文の記述は次の規則に従っています。

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 システムのファイル指定の区切り文字の違いを示しています。

表 1-2 UNIX と OpenVMS のファイル指定の区切り文字
説明 OpenVMS システム UNIX システム
ノード区切り文字 :: !/
デバイス区切り文字 : /
ディレクトリ・パス区切り文字 [ ] /
サブディレクトリ区切り文字 [ . ] /
ファイル拡張区切り文字 . .
ファイル・バージョン区切り文字 ; 適用されない

たとえば, 表 1-3 は, 2 つの有効な指定と 1 つの無効な指定の形式を示しています。

表 1-3 有効および無効な UNIX と OpenVMS のファイル指定
システム ファイル指定 有効/無効
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 のファイル名に変換されます。

注意

OpenVMS バージョン 7.3 以降,HP C RTL に対して, UNIX 形式のファイル指定の先頭の部分をサブディレクトリ名またはデバイス名として解釈することを要求できるようになりました。

以前のリリースと同様に, foo/bar(UNIX 形式の名前) のデフォルト変換は FOO:BAR (OpenVMS 形式のデバイス名) です。

foo/bar(UNIX 形式の名前) を [.FOO]BAR (OpenVMS 形式のサブディレクトリ名) に変換するように要求するには,論理名 DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION を任意の値に定義します。 DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION はファイルごとにチェックされるのではなく,イメージを起動するときに 1 回だけチェックされます。この論理名の定義は, decc$to_vms関数に影響するだけでなく, UNIX 形式と OpenVMS 形式の両方のファイル名を引数として受け付けるすべての HP C RTL 関数に影響します。

UNIX システム環境では,数値のファイル記述子を使用してファイルを参照します。ファイル記述子の中には,標準 I/O デバイスを参照するものと,実際のファイルを参照するものがあります。ファイル記述子がオープンされていないファイルに属す場合は, HP C RTL はそのファイルをオープンします。 HP C は次の OpenVMS 論理名を使用してファイル記述子を評価します。

ファイル記述子 OpenVMS の論理名 意味
0 SYS$INPUT 標準入力
1 SYS$OUTPUT 標準出力
2 SYS$ERROR 標準エラー

1.4.4 拡張ファイル指定

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 節 を参照してください。


前へ 次へ 目次 索引