1. 程式人生 > >(C++)定製一個可輸出更多資訊的assert

(C++)定製一個可輸出更多資訊的assert

    我們經常用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;   
}