(C++)定製一個可輸出更多資訊的assert
阿新 • • 發佈:2019-01-30
我們經常用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; }