我正在使用头文件来定义内联函数,以便通过使用宏将HRESULTS转储到即时窗口.
来自https://www.sellsbrothers.com/writing/a_young_person.htm:
#define lengthof(rg) (sizeof(rg)/sizeof(*rg))
inline const char* StringFromError(char* szErr, long nSize, long nErr)
{
_ASSERTE(szErr);
*szErr = 0;
DWORD cb = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErr, 0, szErr, nSize, 0);
char szUnk[] = "<unknown>";
if (!cb && nSize >= lengthof(szUnk)) lstrcpyA(szErr, szUnk);
return szErr;
}
inline void TraceHR(const char* pszFile, long nLine, HRESULT hr)
{
char szErr[128];
char sz[_MAX_PATH + lengthof(szErr) + 64];
wsprintf(sz, "%s(%d) : error 0x%x: %s\n", pszFile, nLine, hr,
StringFromError(szErr, lengthof(szErr), hr));
OutputDebugString(sz);
return;
}
#ifdef _DEBUG
#define TRACEHR(_hr) TraceHR(__FILE__, __LINE__, _hr)
#else
#define TRACEHR(_hr) _hr
#endif
#define HR(ex) { HRESULT _hr = ex; if(FAILED(_hr)) return TRACEHR(_hr), _hr; }
Run Code Online (Sandbox Code Playgroud)
我正在调用以下宏:
int main()
{
HRESULT hr = E_ACCESSDENIED;
HR(hr);
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)
我发现HR(hr)永远不会返回main,所以std :: cin.get()永远不会被调用.这是预期的行为还是我误解/错误地实现了这个功能?有没有关于此代码调用堆栈展开而不是允许机会处理HR?
当您使用宏时,它只是一个简单的文本替换.所以你的主要成为:
int main()
{
HRESULT hr = E_ACCESSDENIED;
{ HRESULT _hr = hr; if(FAILED(_hr)) return TRACEHR(_hr), _hr; };
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)
由于return语句周围的大括号不会阻止它返回,因此return退出main()和std::cin.get()不会被调用.