ネイティブ 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 ステートメントで作成された型はサポートされません。