ネイティブ C++ の式
デバッガーは、ANSI ほとんどの Microsoft および C/C++ 式を評価できます。デバッガーは、組み込み関数、 および評価式の安全性と、簡単にするために 、コンテキスト演算子 が用意されています。このトピックは、次に関して必要な C++ の式の制限について説明します:
コードやスクリプト、またはマネージ コード式には、コンテキスト演算子やほとんどの書式指定子を使用できません。コンテキスト演算子や書式指定子は、ネイティブ C++ の式エバリュエーターに固有の要素です。
このセクションの内容
状態を保持するデバッガーの関数を使用して intrinisic
シンボルを指定するコンテキスト演算子を使用する
ネイティブ C++ の式の制限
アクセス制御
あいまいな参照
匿名の名前空間
コンストラクター、デストラクター、および変換
継承
インラインおよびコンパイラの組み込み関数
数値定数
演算子関数
オーバーロード
優先順位
シンボルの書式
型キャスト
状態を保持するデバッガーの関数を使用して intrinisic
デバッガーの組み込み関数はアプリケーションの状態を変更せずに式の特定の C/C++ 関数を呼び出す方法を示します。
デバッガーの組み込み関数:
安全であることが保証されます: デバッガーの組み込み関数を実行してデバッグ プロセスが破損しません。
副作用と関数の評価は許可されないシナリオのすべての式で、許されます。
通常の関数呼び出しが実行できないミニダンプをデバッグなどのシナリオで使用します。
デバッガーの組み込み関数は、式の評価をより効率的にすることができます。たとえば、strncmp(str, “asd”) は、ブレークポイント条件にもはるかに作成 str[0] == ‘a’ && str[1] == ‘s’ && str[2] == ‘d’より簡単です。)
区分 |
組み込み関数 |
---|---|
文字列の長さ |
strlen、wcslen、strnlen、wcsnlen |
文字列比較 |
strcmp、wcscmp、stricmp、_stricmp、_strcmpi、wcsicmp、_wcscmpi、_wcsnicmp、strncmp、wcsncmp、strnicmp、wcsnicmp |
文字列の検索 |
strchr、wcschr、strstr、wcsstr |
Win32 |
GetLastError()、TlsGetValue() |
Windows 8 |
WindowsGetStringLen()、WindowsGetStringRawBuffer() これらの関数は、Windows 8.で実行するようにデバッグ プロセスが必要です。ダンプ ファイルをデバッグまたは Windows 8 のデバイスから Visual Studio のコンピューターが Windows 8.を実行するように要求されます生成されました。ただし、Windows 8 のデバイスをリモートでデバッグ、Visual Studio のコンピューターが Windows 7.を実行できます。 |
[その他] |
__log2 丸めるために使用される最も近い整数に小さい整数指定のログの基数 2 を返します。 |
シンボルを指定するコンテキスト演算子を使用する
コンテキスト演算子は、ネイティブなデバッガーによって提供される追加の演算子です。ネイティブ コードをデバッグするときは、ブレークポイントの位置、変数名、または式を修飾するときは、コンテキスト演算子を使用できます。コンテキスト演算子は、ローカル名で隠されていてほかにアクセス方法がない外部スコープから名前を指定するなどの目的に利用できます。
構文
[入力]モジュール、{、} 式
モジュール は、モジュールの名前です。同じ名前を持つモジュールを識別するために完全パスを使用できます。
式 は モジュールの関数名、変数名、またはポインター アドレスなどの有効な対象に、解決する有効な C++ の式です。
中かっこは 2 個のコンマとモジュール (実行可能ファイルまたは DLL) 名前または完全パス含める必要があります。
たとえば、ブレークポイントを EXAMPLE.dll の SomeFunction 関数で設定するには:
{,,EXAMPLE.dll}SomeFunction
モジュール のパスにコンマ、空白、または角かっこが含まれる場合は、コンテキスト パーサーが文字列を適切に認識できるように、パスを引用符で囲む必要があります。単一引用符は Windows ファイル名の一部として解釈されるので、二重引用符を使用する必要があります。次に例を示します。
{,"a long, long, library name.dll", } g_Var
式エバリュエーターが式に含まれる記号を見つけると、次の順序で記号を検索します。
構文のスコープの外部。現在のブロック (角かっこで囲まれた一連のステートメント) から、外側のブロックに進みます。現在のブロックは、現在の場所 (命令ポインター アドレス) を含むコードです。
関数スコープ。現在の関数です。
クラス スコープ。現在の場所が C++ メンバー関数内部の場合です。クラス スコープにはすべての基本クラスが含まれます。式エバリュエーターは、通常の優先順位規則を使用します。
現在のモジュールのグローバル シンボル。
現在のプログラムのパブリック シンボル。
コンテキスト演算子を使って、検索のスタートアップ モジュールを指定し、現在位置をスキップします。
ネイティブ C++ の式の制限
デバッガー ウィンドウに 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 ステートメントで作成された型はサポートされません。