日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:仮想アドレス空間の概要
第 3 章:システム・サービスの 64 ビット・アドレッシングのサポート
第 4 章:メモリ管理 VLM 機能
第 5 章:64 ビット・アドレッシングを対象とする RMS インタフェースの強化
第 6 章:ファイル・システムの 64 ビット・アドレッシングのサポート
第 7 章:OpenVMS Alpha デバイスの 64 ビット・アドレッシングのサポート
第 8 章:OpenVMS Alpha 64 ビット API ガイドライン
第 9 章:64 ビット・アドレッシングをサポートする OpenVMS Alpha ツールおよびユーティリティ
第 10 章:言語およびポインタの 64 ビット・アドレッシング・サポート
第 11 章:DEC C RTL の 64 ビット・アドレッシング・サポート
付録 A :64 ビット・アドレッシングのための C マクロ
付録 B :64 ビット・アドレッシングのための MACRO-32 マクロ
付録 C :64 ビット・プログラム例
付録 D :VLM プログラム例
索引
PDF
OpenVMS ホーム
Open VMS Alpha オペレーティング・システム | HPE 日本

Open VMS Alpha オペレーティング・システム
64 ビット・アドレッシングおよび VLM 機能説明書


目次 索引



DEC C RTL には 64 ビット・ポインタをサポートしない関数もあります。 64 ビット・ポインタをサポートしない関数に 64 ビット・ポインタを渡そうとすると,コンパイラは %CC-W-MAYLOSEDATA 警告メッセージを生成します。 /POINTER_SIZE=64 修飾子を指定してコンパイルしたアプリケーションは, 64 ビット・ポインタをサポートしない関数に 64 ビット・ポインタを渡すことがないように,ソース・コードの修正が必要な場合があります。

32 ビット・ポインタしか使用できない関数を 表 11-2 に示します。 DEC C RTL は,これらの関数に対して 64 ビット・サポートを提供していません。

表 11-2 32 ビット・ポインタに制限されている関数
atexit getopt modf setstate
execve iconv recvmsg setvbuf
execvp initstate sendmsg  
frexp ioctl setbuf  

関数呼び出し処理の一部として,ユーザが提供する関数へのコールバックを行う関数の一覧を 表 11-3 に示します。コールバック・プロシージャに 64 ビット・ポインタが渡されることはありません。

表 11-3 32 ビット・ポインタだけを渡すコールバック
from_vms to_vms
ftw tputs



11.5 ヘッダ・ファイルの読み込み

この節では,DEC 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 修飾子をサポートするすべての DEC C コンパイラは,あらかじめマクロ __INITIAL_POINTER_SIZEを定義しています。このマクロが定義されていない場合, DEC C RTL ヘッダ・ファイルは,暗黙値 0 を使用するという ANSI 規則を利用します。

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

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

ヘッダ・ファイルは,このヘッダがインクルードされる時点では,作用する実際のポインタ・サイズ・コンテキストを決定することができません。さらに,DEC 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 ビット・ポインタを参照する必要がある関数プロトタイプもあります。

DEC C コンパイラは, typedefが作成される時点で, typedefで使用されるポインタ・サイズを結合させます。 __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) および 64 ビット固有のインタフェース (4) は, 32 ビット・ポインタ・サイズ・コンテキストおよび 64 ビット・ポインタ・サイズ・コンテキストの中でそれぞれ宣言されています。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項