日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

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


目次 索引



ここでは, HP C RTL ヘッダ・ファイルで使用されるポインタ・サイズの操作について説明します。これらのヘッダ・ファイルの読み込みについてより理解を深め,各自のヘッダ・ファイルを変更するのに役立つように,次の例を使って説明します。


#1
: 
#if __INITIAL_POINTER_SIZE (1)
#   if (__VMS_VER < 70000000) || !defined __ALPHA (2)
#      error " Pointer size usage not permitted before OpenVMS Alpha V7.0" 
#   endif 
#   pragma __pointer_size __save (3)
#   pragma __pointer_size 32 (4)
#endif 
: 
: 
#if __INITIAL_POINTER_SIZE (5)
#   pragma __pointer_size 64 
#endif 
: 
: 
#if __INITIAL_POINTER_SIZE (6)
#   pragma __pointer_size __restore 
#endif 
: 
 
 

/POINTER_SIZE 修飾子をサポートするすべての HP C コンパイラでは, __INITIAL_POINTER_SIZE マクロがあらかじめ定義されています。 HP C RTL ヘッダ・ファイルは,マクロが定義されていない場合,暗黙の値として 0 を使用するという ANSI の規則に従います。

/POINTER_SIZE 修飾子が使用された場合は,マクロは 32 または 64 として定義されます。修飾子が使用されない場合は,マクロは 0 として定義されます。 (1) に指定されている文は,「ユーザが /POINTER_SIZE=32 または /POINTER_SIZE=64 をコマンド・ラインに指定した場合」と考えることができます。

OpenVMS の多くのバージョンでは, C コンパイラがサポートされます。 (2) に示した行は,コンパイラの対象が 64 ビット・ポインタをサポートしないプラットフォームの場合,エラー・メッセージを生成します。

ヘッダ・ファイルでは,ヘッダ・ファイルが取り込まれたときに有効な実際のポインタ・サイズ・コンテキストに関して,何も仮定することができません。さらに, HP C コンパイラでは, __INITIAL_POINTER_SIZE マクロとポインタ・サイズを変更するための機能だけが提供され,現在のポインタ・サイズを判断するための方法は提供されません。

ポインタ・サイズに依存するすべてのヘッダ・ファイルは,ポインタ・サイズ・コンテキストの保存 (3),初期化 (4),変更 (5),復元 (6) を行う責任があります。

#2
: 
#ifndef __CHAR_PTR32 (1)
#   define __CHAR_PTR32 1 
    typedef char * __char_ptr32; 
    typedef const char * __const_char_ptr32; 
#endif 
: 
: 
#if __INITIAL_POINTER_SIZE 
#   pragma __pointer_size 64 
#endif 
: 
: 
#ifndef __CHAR_PTR64 (2)
#   define __CHAR_PTR64 1 
    typedef char * __char_ptr64; 
    typedef const char * __const_char_ptr64; 
#endif 
: 
 
 

一部の関数プロトタイプでは, 64 ビット・ポインタ・サイズ・コンテキストで 32 ビット・ポインタを参照しなければなりません。また,32 ビット・ポインタ・サイズ・コンテキストで 64 ビット・ポインタを参照しなければならない関数プロトタイプもあります。

HP C は, typedefが作成されるときに, typedefで使用されるポインタ・サイズをバインドします。このヘッダ・ファイルを /POINTER_SIZE 修飾子なしで,または /POINTER_SIZE=SHORT を指定してコンパイルしたと仮定すると, __char_ptr32typedef宣言 (1) は, 32 ビット・コンテキストで行われます。 __char_ptr64typedef宣言 (2) は 64 ビット・コンテキストで行われます。

#3
: 
#if __INITIAL_POINTER_SIZE 
#   if (__VMS_VER < 70000000) || !defined __ALPHA 
#      error " Pointer size usage not permitted before OpenVMS Alpha V7.0" 
#   endif 
#   pragma __pointer_size __save 
#   pragma __pointer_size 32 
#endif 
: 
(1)
: 
#if __INITIAL_POINTER_SIZE (2)
#   pragma __pointer_size 64 
#endif 
: 
(3)
: 
int abs (int __j); (4)
: 
__char_ptr32 strerror (int __errnum); (5)
: 
 
 

64 ビット・ポインタをサポートする関数プロトタイプを宣言する前に,ポインタ・コンテキストは 32 ビット・ポインタから 64 ビット・ポインタに変更されます (2)

32ビット・ポインタに制限される関数は,ヘッダ・ファイルの 32 ビット・ポインタ・コンテキスト・セクション (1) に配置されます。他のすべての関数は,ヘッダ・ファイルの 64 ビット・コンテキスト・セクション (3) に配置されます。

ポインタ・サイズの影響を受けない関数 ((4)(5)) は 64 ビット・セクションに配置されます。 32 ビットのアドレス戻り値以外はポインタ・サイズの影響を受けない関数 (5) も 64 ビット・セクションに配置され,前に説明したように, 32 ビット固有の typedefを使用します。

#4
: 
#if __INITIAL_POINTER_SIZE 
#   pragma __pointer_size 64 
#endif 
: 
: 
#if __INITIAL_POINTER_SIZE == 32 (1)
#   pragma __pointer_size 32 
#endif 
: 
char *strcat (char *__s1, __const_char_ptr64 __s2); (2)
: 
#if __INITIAL_POINTER_SIZE 
#   pragma __pointer_size 32 
    : 
    char *_strcat32  (char *__s1, __const_char_ptr64 __s2); (3)
    : 
#   pragma __pointer_size 64 
    : 
    char *_strcat64  (char *__s1, const char *__s2); (4)
    : 
#endif 
: 
 
 

この例では, 32 ビット版と 64 ビット版の両方が用意されている関数の宣言を示しています。これらの宣言はヘッダ・ファイルの 64 ビット・セクションに配置されます。

関数に対する通常のインタフェース (2) は, /POINTER_SIZE 修飾子に指定したポインタ・サイズを使用して宣言されます。ヘッダ・ファイルは 64 ビット・ポインタ・コンテキストに配置され, (1) に示した文が指定されているため, (2) の宣言は,/POINTER_SIZE 修飾子と同じポインタ・サイズ・コンテキストを使用して行われます。

32 ビット固有のインタフェース (3) は 32 ビット・ポインタ・サイズ・コンテキストで宣言され, 64 ビット固有のインタフェース (4) は 64 ビット・ポインタ・サイズ・コンテキストで宣言されます。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.