assert は ANSI C 標準マクロとして assert.h に定義されている。
VisualStudio 環境では, Console アプリケーションは stderr に出力されて
GUI アプリケーションでは メッセージボックスが出力される。
POINT
1つのアサートに対して1つのチェックをすること。
assert( p != NULL );
// これでは どちらのチェックに失敗したか不明。
assert( p != NULL && cnt > 0 );
自前でマクロを再定義しておくと便利。
デバッグしやすいように、できるだけ情報( 式, メッセージ, ファイル、行 )を出力しておく。
do - while(0) をするのは if() assert() とあった場合の対策。
void assertmessage( const char *exp, const char *msg, const char *file, int line )
{
printf("ASSERT FAIL: MESSAGE[%s] EXP[%s] FILE[%s] LINE[%d]", msg, exp, file, line );
}
#undef assert
#define assert( cond, msg ) \
do { \
if ( !(cond) ) { \
assertmessage( #cond, msg, __FILE__, __LINE__ ); \
DebugBreak(); \
} \
} while (0)
デバッグ以外のときはアサートは無効にする。
#ifdef _DEBUG
# define assert( x ) do{ }while(0)
#else
# define assert( x )
#endif
■ _ASSERT(_ASSERTE)
assert は ANSI C 標準マクロであり, _ASSERT, _ASSERTE は VisualStudio 固有のアサートマクロ。
_ASSERTE は Expression(アサート式)を表示してくれるため、こちらの方がデバッグ時に役にたつ。
#include< crtdbg.h>
_ASSERTE( !"test" );
マクロの展開結果を見てみると、
ファイル名, 行, 式が _CrtDbgReport() に渡されていることがわかる。
cl /D"_DEBUG" /P test.cpp
(void) ((!!((!"test"))) || (1 != _CrtDbgReportW(2, L"test.cpp", 79, 0, L"!\"test\"")) || (__debugbreak(), 0));