assert は ANSI C 標準マクロとして assert.h に定義されている。
    VisualStudio 環境では, Console アプリケーションは stderr に出力されて
    GUI アプリケーションでは メッセージボックスが出力される。
    POINT
      1つのアサートに対して1つのチェックをすること。
      assert( p != NULL );
      // これでは どちらのチェックに失敗したか不明。
      assert( p != NULL && cnt > 0 );
    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"  );
    cl /D"_DEBUG" /P test.cpp
    (void) ((!!((!"test"))) || (1 != _CrtDbgReportW(2, L"test.cpp", 79, 0, L"!\"test\"")) || (__debugbreak(), 0));