11

と呼ばれる非静的 const メソッドsize_t A::m() constがあります。これを使用して、1 より大きい値を返す場合にブレークポイントをトリガーしたいと考えていclass Aますa

class A
{
public:
    std::vector<double> myvec;
    size_t m() const
    {
      return myvec.size();
    }
} a;

したがって、この条件で Visual Studio 2013 にブレークポイントを追加します

a.m() > 1 // a is an instance of class A

ただし、これをコンパイルしようとすると、IDE から次のメッセージが表示されます。

次のブレークポイントは設定できません:

myFile.cpp の xxx 行で、'am() > 1' が true の場合

この式には副作用があり、評価されません。

A::m()は何も変更しないことに注意してください.size()。ベクトルのメソッドを呼び出してその値を返すだけなので、式に副作用があるという主張は単に偽です。実際、ブレークポイント条件を(つまり、メソッド自体の内容)に置き換えても、同じ効果があります!a.myvec.size() > 1

ブレークポイントで条件として使用できるものについて、マイクロソフトは次のように述べています。

条件は、デバッガーによって認識される任意の有効な式にすることができます。

だから私は行き、デバッガーの式を見て、これを見つけました:

副作用の一般的な原因の 1 つは、デバッガー ウィンドウで関数呼び出しを評価することです。このような評価は通常顕著です。副作用のより微妙な原因は、マネージ コード内のプロパティおよびその他の暗黙的な関数呼び出しの評価です。

デバッガーは、プロパティの評価または暗黙的な関数呼び出しに副作用があるかどうかを判断できません。したがって、デフォルトでは、デバッガーは暗黙的な関数呼び出しを自動的に評価しません。プロパティの評価は既定で許可されていますが、[オプション] ダイアログ ボックスでオフにすることができます。関数呼び出しまたはプロパティが評価されていない場合は、更新アイコンが表示されます。更新アイコンをクリックすると、式を手動で評価できます。詳細については、「方法: 監視値を更新する」を参照してください。

プロパティの評価または暗黙的な関数呼び出しがオフになっている場合は、ac 形式修飾子を使用して強制的に評価できます (C# のみ)。C# の書式指定子を参照してください。

誰かが上記の段落を英語に翻訳できれば、それは素晴らしいことです. これらのデバッガ条件に関数を入れることはできますか?

4

4 に答える 4

10

あなたが提供したヘルプリンクの私の翻訳は次のとおりです。

  • パラグラフ 1: 関数の呼び出しにはおそらく副作用があります。プロパティを評価すると、副作用が生じる場合があります。
  • パラグラフ 2: デバッガーは副作用があるかどうかを判断できないため、「関数 = 悪い」、「プロパティ = 良い」(つまり、「関数には副作用がありますが、プロパティにはありません」) と仮定します。当面の問題に関係のないアイコン情報を更新します。
  • パラグラフ 3: デバッガーを強制しますか? C# を使用している場合は,ac、評価の後に入れます。

要するに、評価で関数を呼び出したいのに C# を使用している場合は、,acその後に置きます。

a->m() > 1,ac

C++ を使用しているので、これは「評価ステートメントに関数がありません!」に要約されると思います。指定子はロジック フローに影響を与えない (すべきではない)ため、デバッグの目的でから const を削除できる可能性があります。A::mしかし、それがうまくいくかどうかさえわかりません。

于 2013-11-04T23:20:47.417 に答える
2

ステートメントを翻訳する良い答えがありますが、誰かが使用できる素敵なハックがあります。

ブレークポイントを追加するコードで、次のような行を追加します。

auto debug = a.m()

そこにブレークポイントを設定すると、これを条件に追加できます

debug > 1

または、このようなことを行うことができます

if (a.m() > 1)
    bool debug = 1;

デバッグ行にブレークポイントを設定できます。

于 2016-08-26T17:58:37.630 に答える
1

ここでは暗闇で撮影しますがconst、メソッド宣言での の使用をさらに詳しく調べたいと思うかもしれません。const に変更してはいけないものはすべて明示的に記述したい場合があります (IIRC では正しく const をメソッド宣言の 5 つの異なる場所で使用できるため、注意して確認してください)。

constコンパイラが強制する契約です。メソッドが const 以外のポインターにアクセスすると、問題が発生する可能性があります。問題になる可能性のある静的変数がある場合。また、コード内で const が適切であることをコンパイラが喜んでいる一方で、IDE がコンパイラほどインテリジェントではない可能性もあります (そのため、より多くのconst保証が必要になる場合があります)。

あなたのコードがなければ、確かに言うのはちょっと難しいですが、これは少なくともアイデアを与えるはずです.

の詳細についてはconst、このページに適切なチュートリアルがあるようです。

http://www.cprogramming.com/tutorial/const_correctness.html

于 2013-11-04T23:10:03.457 に答える