(C++)定制一个可输出更多信息的assert

来源:互联网 发布:node.js视频教程 编辑:程序博客网 时间:2024/05/16 17:59

    我们经常用assert来除错,它能告诉我们断言失败的代码行和表达式。但是,有时我们希望能在assert失败时得到更多信息,例如:当GetLastError()  != ERROR_SUCCESS时,还希望将这个ErrorCode到底是多少也显示在assert弹出的对话框中。

    废话就不多说了,直接上代码:

#pragma once///////////////////////////////////////////////////////////////////// XASSERT:  assert with user-define message, use wide char///////////////////////////////////////////////////////////////////#include <string>#include <crtdbg.h>#ifndef _DEBUG#define XASSERT(exp_, msgw_) ((void)0)#else#define XASSERT(exp_, msgw_) _ASSERT_EXPR((exp_), (std::wstring(L#exp_)+L"\r\nMessage: "+(msgw_)).c_str())#endif

    这里大家可以根据需要自行扩展。


    下面是一个调用的例子:

::OpenProcess(0,0,0);XASSERT(GetLastError() == ERROR_SUCCESS, GetErrorString(GetLastError()));



    其中GetErrorString是提取ErrorCode对应的描述信息的函数,定义如下:

std::wstring GetErrorString(DWORD dwErrCode)   {   DWORD dwRet = 0;   LPWSTR szResult = NULL;std::wstring s;dwRet = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,dwErrCode,   MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPWSTR)&szResult,   0,   NULL);   if (dwRet == 0){   szResult = NULL;return s;}   s = szResult;LocalFree(szResult);return s;   }


原创粉丝点击