我正在使用头文件定义内联函数,以便通过使用宏将 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; }
我从以下位置调用宏:
int main()
{
HRESULT hr = E_ACCESSDENIED;
HR(hr);
std::cin.get();
}
我发现 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();
}
由于 return
语句周围的大括号不会阻止它返回,return
从 main()
和 std 退出::cin.get()
未被调用。
关于c++ - 为什么这个通过宏调用的内联错误函数没有返回到main?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837196/