| 前へ | 次へ | 目次 | 索引 |
次の各節では,バージョン5.5 よりも前のバージョンの C++ コンパイラによってコンパイルされた C++ プログラムのデバッガによるサポートについて説明します。
バージョン5.5 以降のバージョン(Alpha のみ)でコンパイルされた C++ プログラムのデバッガによるサポートについては,付録 C.6 節 を参照してください。
C.7.1 %name レキシカル関数
Compaq C++ で関数やデータ・メンバのような特定のエンティティを参照するには,デバッガ・コマンドで %name レキシカル関数の使用が要求されます。この関数を使用するときは,必ずコマンドと参照の間に置きます。次の各項で,この関数が必要な場合の正しい使用法の例を示します。
C.7.2 言語式の演算子
言語式でサポートされている C++ の演算子を次に示します。
| 種類 | シンボル | 機能 |
|---|---|---|
| 接頭辞 | * | 間接参照 |
| 接頭辞 | & | アドレス |
| 接頭辞 | sizeof | サイズ |
| 接頭辞 | - | 単項負符号(否定) |
| 挿入辞 | + | 加算 |
| 挿入辞 | - | 減算 |
| 挿入辞 | * | 乗算 |
| 挿入辞 | / | 除算 |
| 挿入辞 | % | 剰余 |
| 挿入辞 | << | 左シフト |
| 挿入辞 | >> | 右シフト |
| 挿入辞 | == | 等値 |
| 挿入辞 | != | 不等 |
| 挿入辞 | > | 大なり |
| 挿入辞 | >= | 以上 |
| 挿入辞 | < | 小なり |
| 挿入辞 | <= | 以下 |
| 接頭辞 | ~(チルド) | ビット単位のNOT |
| 挿入辞 | & | ビット単位のAND |
| 挿入辞 | | | ビット単位のOR |
| 挿入辞 | ^ | ビット単位の排他的OR |
| 接頭辞 | ! | 論理否定 |
| 挿入辞 | && | 論理積 |
| 挿入辞 | || | 論理和 |
感嘆符(!)は演算子なので,C++ プログラムではコメントの区切り文字としては使用できません。ただし,デバッガのログ・ファイルをデバッガ入力として使用することを許可するために,! がスペースを除けば行の先頭にある場合にかぎって,デバッガは ! をコメントの区切り文字として認識します。C++ 言語モードでは,デバッガは /* をコメントの区切り文字として受け入れます。コメントは現在の行の最後まで続きます。対応する */ は不要ですし,認識もされません。
デバッガは,アスタリスク(*)接頭辞を C++ の言語式およびデバッガのアドレス式の両方で間接参照演算子として受け入れます。言語が C++ に設定されているときは,アドレス式では,*接頭辞はピリオド(.)接頭辞や@接頭辞と同義です。
デバッグ中のプログラムの誤修正を防ぐために,デバッガは C++ およびその他のどの言語でも代入演算子を一切サポートしません。したがって,=,+=,--=,++,-- のような演算子は認識しません。記憶位置の内容を変更するには,明示的なdepositコマンドを使用しなければなりません。
C.7.3 言語式とアドレス式の構造
サポートされている,C++ の言語式とアドレス式の構造を次に示します。
| シンボル | 構造 |
|---|---|
| [ ] | 添字指定 |
| .(ピリオド) | 構造体構成要素の選択 |
| -> | ポインタの間接参照 |
サポートされている C++ のデータ型を次に示します。
| C++ のデータ型 | オペレーティング・データの名前 |
|---|---|
| __int64(Alpha 固有) | クォドワード(Q) |
| unsigned __int64(Alpha 固有) | クォドワード符号なし(QU) |
| __int32(Alpha 固有) | ロングワード整数(L) |
| unsigned __int32(Alpha 固有) | ロングワード符号なし(LU) |
| int | ロングワード整数(L) |
| unsigned int | ロングワード符号なし(LU) |
| __int16(Alpha 固有) | ワード整数(W) |
| unsigned __int16(Alpha 固有) | ワード符号なし(WU) |
| short int | ワード整数(W) |
| unsigned short int | ワード符号なし(WU) |
| char | バイト整数(B) |
| unsigned char | バイト符号なし(BU) |
| float | F 浮動小数点数(F) |
| __f_float(Alpha 固有) | F 浮動小数点数(F) |
| double | D 浮動小数点数(D) |
| double | G 浮動小数点数(G) |
| __g_float(Alpha 固有) | G 浮動小数点数(G) |
| float(Alpha 固有) | IEEE S 浮動小数点数(FS) |
| __s_float(Alpha 固有) | IEEE S 浮動小数点数(FS) |
| double(Alpha 固有) | IEEE T 浮動小数点数(FT) |
| __t_float(Alpha 固有) | IEEE T 浮動小数点数(FT) |
| enum | (なし) |
| struct | (なし) |
| ラベル | (なし) |
| ポインタ型 | (なし) |
| 配列型 | (なし) |
float 型の浮動小数点数は,コンパイラのスイッチによって,F 浮動小数点数または IEEE S浮動小数点数のどちらかで表されます。
double 型のの浮動小数点数は,コンパイラのスイッチによって,IEEE T 浮動小数点数,D 浮動小数点数,または G 浮動小数点数のどれかで表されます。
C.7.5 大文字小文字の区別
C++ 言語では,シンボル名の大文字と小文字は区別され,それぞれ別個の文字として処理されます。
C.7.6 修飾子がついたクラス名
次の各項では,デバッガを使用するときのクラス・メンバの名前の作成方法を説明するために,修飾子がついたクラス名 という用語を使用します。あるクラスが別のクラスで定義されていなければ,修飾子がついたクラス名はそのクラス自身の名前にすぎません。しかし,もしこのクラスが別のクラス内でネストされていれば,そのネストのすぐ外のクラスの名前を前に付けなければなりません。このとき,区切り文字として一対のコロン(::)を使用します。外側のクラスもネストされている場合は,その名前も前に付けなければなりません。
適切な修飾子がついたクラス名の例を次に示します。
DBG> set break %name 'C::f' ! f is a member of class C
DBG> set break %name 'FOO::BAR::BAZ::g' ! g is a member of BAZ,
! which is nested in BAR,
! which is nested in FOO
|
本項では,C++ のデータに対するデバッガの使用法を説明します。
C.7.7.1 非静的データ・メンバ
本項では,静的とは宣言されていないデータ・メンバを参照する方法を説明します。
C.7.7.1.1 継承されないデータ・メンバ
C++ のクラスまたは struct か union で直接定義されている非静的データ・メンバを参照するには,その名前を,C 言語の struct メンバや union メンバの場合と同じように使用します。非静的データ・メンバ参照の正しい使用法を次の例で示します。
DBG> examine x.m, p->m |
現在のところ,デバッガのサポートでは,各種の基底クラスから継承される非静的データ・メンバを区別するのに,メンバに至る継承パス,さらにメンバが宣言されているクラスに至る継承パス上の 重要な 基底クラス名をメンバ名の前に付けます。オブジェクトからメンバに至るパスの上の基底クラスが多重継承を使用して受け継がれたものなら,当基底クラスは重要です。したがって,2 つ以上の基底指定子が含まれている基底リストで基底クラスが言及されていれば,その基底クラスは重要です。
この表記法では,基底クラスに至る継承パスを記述するための必要最少限の数の基底クラス接頭辞を作成します。つまりこの表記法では,パスをたどっていくときに次に進む先を選ぶために必要な基底クラスだけを命名するからです。多重継承を行わないときは,参照は次の形式を取ります。
%name'CLASS::member' |
オブジェクトの基底クラスから継承された非静的データ・メンバを参照するには,%name で二重コロンで区切った一連の修飾子がついた重要な基底クラス名とメンバ名を引用符で囲みます。一連の重要な基底クラスを指定する順序は,オブジェクトの最も疎遠の重要クラスからオブジェクトに最も近い重要基底クラスへという順序です。たとえば,次の宣言の継承図式を考えてみましょう。
struct A { int a_member; };
struct B : A { int b_member; };
struct C { int c_member; };
struct D : B, C { int d_member; };
struct E : D { int e_member; };
struct F { int f_member; };
struct G : F { int g_member; };
struct H : E, G { int h_member; };
struct I : H { int i_member; };
struct J : I { int j_member; };
static J j_object;
|
多重継承の行われる基底リストでクラス B,C,E,および G が言及されているので,これらのクラスは接頭辞として現れる重要クラスです。次の例は,デバッガの deposit コマンドですべてのメンバを参照しています。継承されたメンバが重要なクラスに属するかどうかに関係なく,そのメンバ自身のクラスはメンバ名の前に出現することに注意してください。
C.7.7.1.3 継承される仮想データ・メンバ
デバッガでは,仮想基底クラスのデータ・メンバへのシンボリック・アクセスは現在サポートされていません。ただし,例外がひとつあります。それは,__bptr という名前のポインタ・メンバがそのようなオブジェクトの中にあるということです。
C.7.7.2 静的データ・メンバ
静的データ・メンバを参照するには,%name で,その修飾子がついたクラス名,2 つのコロン(::),およびメンバ名を引用符で囲ます。
静的データ・メンバ参照の正しい使用法を次の例で示します。
DBG> examine %name 'C::s' DBG> examine %name 'FOO::BAR::BAZ::sdm' |
参照で宣言されたオブジェクトの値にアクセスするには,そのオブジェクトの名前を使用します。
デバッガは,参照型で宣言されたデータ・メンバをポインタ変数であるかのように扱います。したがって,そのメンバ名には間接参照演算子の*または->を使用しなければなりません。
次に例を示します。
class C {
public:
int &ref_mem;
C(int &arg): ref_mem(arg){}
};
main()
{
auto int obj = 5;
auto int &ref_obj = obj;
auto C c(obj);
obj = 23;
}
...
|
メンバをチェックするためにデバッガを使用するための正しい方法を次のシーケンスで示します。
stepped on return from routine REF\main
to REF\main\%LINE 13+16
13: }
DBG> examine obj, ref_obj
REF\main\obj: 23
REF\main\ref_obj: 23
DBG> examine c
REF\main\c
ref_mem: 2144211292
DBG> symbolize c.ref_mem
address 7FCE1154:
REF\main\c
DBG> examine *c.ref_mem
*REF\main\c.ref_mem: 23
|
メンバを指すポインタであるオブジェクトは,64 ビットの整数で表されます。
C.7.7.5 型によるエンティティの参照
オブジェクトやメンバの値を型でチェックし,表示するには,EXAMINE/TYPE というコマンドを使用します。同様に,DEPOSIT/TYPE というコマンドを使用することにより,指定した型に格納する式の値を修正できます。/TYPE 修飾子を使用する場合,これらのコマンドの構文は次のとおりです。
deposit/type=(name) examine/type=(name) |
name で示された型は,プログラムで宣言された変数の名前またはデータ型の名前でなければなりません。/type修飾子は,特に 2 つ以上の型で宣言された C++ のオブジェクトを参照するときに役立ちます。
C.7.8 C++ の関数に対する OpenVMS デバッガの使用
本項では,各種の関数や関数の引数を参照する方法を説明します。
C.7.8.1 オーバロードされた関数
コードの中で関数のシンボリック名を見つけるには,SHOW SYMBOL コマンドを使用します。関数がオーバロードされている場合は,オーバロードされているシンボリック名を表示するために,名前の指定でワイルドカード文字(*)を使用します。
次に例を示します。
class base
{
public:
base();
base(int);
~base();
int base_f1();
void base_f2();
void base_f2(int);
void base_f2(char);
};
|
オーバロードされている記号を表示し,適当な関数参照を決定する方法を次のシーケンスで示します。
DBG> set break %name 'base::base_f2'
%DEBUG-E-NOTUNQOVR, symbol 'base::base_f2' is overloaded
use SHOW SYMBOL to find the unique symbol names
DBG> show symbol *base_f2
overloaded symbol CXX_T10_179\base::base_f2
overloaded instance CXX_T10_179\base::base_f2__1
overloaded instance CXX_T10_179\base::base_f2__2
overloaded instance CXX_T10_179\base::base_f2__3
DBG> set break %name 'base::base_f2__2'
DBG> step
stepped to CXX_T10_179\main\%LINE 20
20: x.base_f2();
DBG> step
stepped to CXX_T10_179\main\%LINE 21
21: x.base_f2(5);
DBG> step
break at routine CXX_T10_179\base::base_f2__2
12: void base_f2(int){}
DBG> step
stepped to CXX_T10_179\main\%LINE 22
22: x.base_f2('W');
stepped to CXX_T10_179\main\%LINE 22
DBG> go
'Normal successful completion'
DBG> ^Z
|
メンバ関数を参照するには,%name で,その修飾子がついているクラス名,2 つのコロン(::),およびメンバ関数の名前を引用符で囲みます。メンバ関数がオーバロードされている場合は,接尾辞__integer-number を付けます。
メンバ関数参照の正しい使用法を次の例で示します。
DBG> set break %name 'MYSTRING::length'
DBG> set break %name 'MYCOMPLEX::format__1', %name
'MYCOMPLEX::format__2'
|
コンストラクタを参照するには,その名前を使用します。コンストラクタがオーバロードされている場合は,接尾辞__integer-number を付けます。
コンストラクタ参照の正しい方法を次の例で示します。
DBG> set break FOO DBG> set break MYSTRING__1 |
デストラクタを参照するには,%name で,その名前と共にチルド(~)を引用符で囲みます。
デコンストラクタ参照の正しい方法を次の例で示します。
DBG> set break %name '~FOO' |
| 前へ | 次へ | 目次 | 索引 |