次の方法で共有


ネイティブ C++ の式の制限事項

更新 : 2007 年 11 月

このトピックの内容は、次の製品に該当します。

Edition

Visual Basic

C#

C++

Web Developer

Express

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Standard

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Pro/Team

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

トピックは該当しますが、コマンドは既定では非表示です

既定で非表示のコマンド

デバッガ ウィンドウに C/C++ 式を入力する場合は、次の一般的な制限事項が適用されます。

アクセス制御

デバッガは、アクセス制御とは無関係にすべてのクラス メンバにアクセスできます。基本クラスや埋め込みメンバ オブジェクトなど、任意のクラス オブジェクト メンバをチェックできます。

あいまいな参照

デバッガ式があいまいなメンバ名を参照する場合は、クラス名を使って修飾する必要があります。たとえば、CObject が CClass クラスのインスタンスであり、AClass と BClass の両方から expense という名前のメンバ関数を継承する場合、CObject.expense はどちらを指すのかが不明瞭です。あいまいな参照は、次の方法で解決できます。

CObject.BClass::expense

あいまいな参照を解決するために、式エバリュエータではメンバ名について通常の優先規則が適用されます。

匿名の名前空間

ネイティブ C++ の式エバリュエータでは、匿名の名前空間をサポートしていません。たとえば、次のようなコードがあるとします。

#include "stdafx.h"

namespace mars

{

namespace

{

int test = 0;

}

}

int main()

{

// Adding a watch on test does not work.

mars::test++;

return 0;

}

この例でシンボル test をウォッチするには、装飾名を使用する方法しかありません。

(int*)?test@?A0xccd06570@mars@@3HA

コンストラクタ、デストラクタ、および変換

暗黙的または明示的にかかわらず、一時オブジェクトを構築するために呼び出す式を使って、オブジェクトのコンストラクタやデストラクタを呼び出すことはできません。たとえば、次の式は明示的にコンストラクタを呼び出して、エラー メッセージを生じます。

Date( 2, 3, 1985 )

変換先がクラスである場合は、変換関数を呼び出せません。クラスへの変換には、オブジェクトの構築が必要です。たとえば、myFraction が CFraction のインスタンスであり、変換関数演算子 FixedPoint を定義する場合、次の式はエラーになります。

(FixedPoint)myFraction

ただし、変換先が組み込み型である場合は、変換関数を呼び出すことができます。CFraction が変換関数 operator float を定義する場合、デバッガでは次の式は有効です。

(float)myFraction

オブジェクトを返す関数やローカル オブジェクトを宣言する関数を呼び出すことができます。

new 演算子や delete 演算子を呼び出すことはできません。デバッガでは次の式は機能しません。

new Date(2,3,1985)

継承

仮想基本クラスを持つクラス オブジェクトをデバッガで表示する場合、仮想基本クラスのメンバのインスタンスが 1 つしか格納されていなくても、メンバは継承パスごとに表示されます。

仮想関数の呼び出しは、式エバリュエータによって適切に処理されます。たとえば、クラス CEmployee が仮想関数 computePay を定義するとします。この関数は CEmployee から継承するクラスに再定義されます。CEmployee へのポインタを通じて computePay を呼び出して、適切な関数を実行させることができます。

empPtr->computePay()

派生クラス オブジェクトへのポインタを基本クラス オブジェクトへのポインタにキャストできます。逆方向のキャストはできません。

組み込み関数とインライン関数

デバッガ式で組み込み関数やインライン関数を呼び出すには、その組み込み関数やインライン関数が少なくとも一度は通常の関数として現れている必要があります。

数値定数

デバッガ式では、8 進数、10 進数、16 進数の 3 つの形式の整数定数を使用できます。既定では、10 進数の定数を受け取ります。この設定は、[デバッグ] タブの [全般] ページで変更できます。

プリフィックス シンボルやサフィックス シンボルを使って、別の基数で数を表すことができます。使用できる形式を次の表に示します。

構文

例 (decimal 100)

基数

100 または 64

10 進または 16 進 (現在の設定によって変わります)。

0数

0144

8 進数 (基数 8)。

0n数

0n100

10 進数 (基数 10)。

0x数

0x64

16 進数 (基数 16)。

数h

64h

16 進数 (基数 16)。

演算子関数

デバッガ式は、クラスの演算子関数を暗黙的にも明示的にも呼び出すことができます。たとえば、myFraction および yourFraction が、operator+ を定義するクラスのインスタンスであるとします。これら 2 つのオブジェクトの合計は次の式で表示できます。

myFraction + yourFraction

演算子関数がフレンドとして定義される場合は、メンバ関数と同じ構文で暗黙的に呼び出すことができます。また、次のように明示的に呼び出すこともできます。

operator+( myFraction, yourFraction )

演算子関数は、通常の関数と同様に、オブジェクト構築を伴う変換が必要な引数を指定して呼び出すことはできません。

デバッガは、定数のバージョンでも非定数のバージョンでも、オーバーロードされた演算子をサポートしません。const バージョンと非 const バージョンを持つオーバーロードされた演算子は、標準テンプレート ライブラリで頻繁に使用されます。

オーバーロード

完全に一致する関数が存在する場合や、一致条件にオブジェクト構築を伴う変換を必要としない場合、デバッガ式はオーバーロードされた関数を呼び出すことができます。たとえば、関数 calc が CFraction オブジェクトをパラメータとして受け取り、CFraction クラスが引数として 1 つの整数を受け付けるコンストラクタを定義している場合、次の式はエラーになります。

calc( 23 )

整数から calc の必要とする CFraction オブジェクトへの変換が有効な場合でも、変換にはオブジェクトの作成が必要であり、この変換はサポートされていません。

優先順位

デバッガ式での C++ のスコープ演算子 (::) は、ソース コード内にあるときよりも優先順位が低くなります。C++ のソース コードでは、スコープ演算子は最高の優先順位になります。デバッガでのスコープ演算子の優先順位は、ベース演算子や後置演算子 (->、++、--) と単項演算子 (!、&、* など) の間になります。

シンボルの書式

完全なデバッグ情報 (/Zi または /ZI) でコンパイルされたモジュールにシンボルが含まれる場合は、ソース コードで使用されるのと同じ形式で、シンボルを含むデバッガ式を入力します。/Zd でコンパイルされたライブラリやモジュールで使用されるパブリック シンボルを含む式を入力する場合は、シンボルの装飾名 (オブジェクト コードで使用される形式) を使用する必要があります。詳細については、「/Z7、/Zd、/Zi、/ZI (デバッグ情報の形式)」を参照してください。

LINK /MAP オプションを使用すると、すべての名前のリストを装飾された形式でも装飾されていない形式でも取得できます。詳細については、「/MAP (マップ ファイルの生成)」を参照してください。

名前の装飾は、タイプ セーフ リンケージを適用するためのしくみです。つまり、スペル、大文字と小文字、呼び出し規約、および型が正確に一致する名前や参照だけがリンクされることになります。

C 呼び出し規約に従って _cdecl キーワードで暗黙的または明示的に宣言された名前は、先頭にアンダースコア (_) が付きます。たとえば、関数 main は _main として表示できます。_fastcall として宣言された名前は、先頭に @ 記号が付きます。

C++ の場合、装飾された名前は、呼び出し規約に加えてシンボルの型をエンコードします。この名前の形式は長くて読みにくくなることがあります。名前の先頭には少なくとも 1 つの疑問符 (?) が付きます。C++ 関数の場合、装飾には関数スコープ、関数のパラメータ型、および関数の戻り値の型が含まれます。

型キャスト

型のキャストを行う場合、その型をデバッガが認識する必要があります。プログラム内には、その型の別のオブジェクトが存在する必要があります。typedef ステートメントで作成された型はサポートされません。

参照

その他の技術情報

ネイティブ C++ 言語の式