3

私の同僚はちょうど私に問題を手伝ってくれるように頼みました、彼は彼のコードに数行あります

for (long counter = 0; counter < End; )
{
  ...
  assert(counter++ < MAX);
  ...
}

問題は、Visual Studioを使用して行ごとにデバッグすると、assert()行が常にスキップされcounter、インクリメントされないため、ループが終了しないように見えることです。

VSを使用して逆アセンブリを見ると、このassert()関数のアセンブリラインはありません。私はこれまでassert()を使用したことがないので、これは正常であり、コードの動作をassert()に入れてはいけないのか、デバッガーなどで何か問題があるのでしょうか。

ありがとう。

4

5 に答える 5

6

デバッグビルドでのみ有効になっているため、つまり、が定義されていない場合は、が定義されてNDEBUGないことを確認してください。assertNDEBUG

ここから:

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif

つまり、NDEBUGが定義されassertている場合、アセンブリで観察されるのはno-opです。

于 2012-07-24T17:39:33.387 に答える
4

assertはデバッグ目的でのみ使用する必要があります。

この線

assert(counter++ < MAX);

ロジックが含まれていますが、含まれてはなりません。

非デバッグビルドでは、実行されることはありません。

于 2012-07-24T17:40:45.960 に答える
3

assertはマクロであり、リリースビルドで削除されます。したがって、デバッグビルドを見ているのでない限り、assertコードが表示されることを期待しないでください。

また、これassertはマクロであり、関数ではないため、単一の関数呼び出しのようには見えない可能性があります。

于 2012-07-24T17:40:01.000 に答える
1

アサートは通常、リリースビルドから削除されるため、デバッグビルドに対してのみ実行されます。assertのプログラムロジックに影響を与える副作用はありません。

于 2012-07-24T17:40:24.447 に答える
1

コードがリリースモードでビルドされている場合、assertステートメントは含まれません。同僚はリリースモードを使用していますか?

Visual Studioの最適化設定でも、assertステートメントが削除される場合があります。

同僚は、assertステートメントを使用しないようにforループを変更できませんでしたか?

于 2012-07-24T17:45:52.853 に答える