1

ヘッダー内<vector>には、次のようなコードがあります。

_DEBUG_ERROR("vector iterator not dereferencable");
_SCL_SECURE_OUT_OF_RANGE;

これはメッセージでプログラムを停止し、プログラマーにコードをデバッグする機会を与えます。

ちょっとしたおもちゃのプロジェクトでは、_DEBUG_ERROR自分を使いたいです。で定義されてい<xutility>ます。

ただし、を含め<xutility>て使用しようとすると_DEBUG_ERROR、次のエラーが発生します。

error C3861: "_Debug_message": identifier not found.

しかし、28行目の内部で定義されてい_Debug_message ます!<xutility>コンパイラが文句を言うのはなぜですか?

また、デバッグのためにプログラムを停止する別の(おそらく多少移植性がある?)方法はありますか?

4

2 に答える 2

1

100%確実ではありませんが、実際には確かですstd::_Debug_message。そしてPlasmaHHは正しいです:それassert()は通常の解決策です。assert(!"message")カスタムメッセージを取得するために書くことができます。(注意してください!)

于 2013-01-15T13:51:21.960 に答える
0

ASSERTまたは_ASSERTマクロを使用して、アサートとデバッグを行うことができます。または、独自のassert-macroを作成することもできます。_ASSERT(から取得crtdbg.h)の定義を使用します。

#define _ASSERT_EXPR(expr, msg) \
        (void) ((!!(expr)) || \
                (1 != _CrtDbgReportW(_CRT_ASSERT, _CRT_WIDE(__FILE__), __LINE__, NULL, L"%s", msg)) || \
                (_CrtDbgBreak(), 0))

ここで重要な関数は_CrtDbgReportWです。これは、3つの標準ボタン(中止、再試行、無視)を備えたアサーションダイアログボックスを表示します。戻り値に応じて、他の関数を呼び出すことができます。上記のマクロ_CrtDbgBreakでは、ユーザーが[再試行]ボタンを押すと関数が呼び出されます(これにより、関数は1を返します。MSDNを参照してください)。

ログファイルに書き込んだり、出力ウィンドウをデバッグするために表示したり(を使用してOutputDebugString)、または好きなことを行うことができます。

于 2013-01-26T11:37:33.577 に答える