简而言之,我想要这种行为:
#if defined(DEBUG) || defined(_DEBUG)
#define CHECK_HRESULT(x) \
{ \
HRESULT hr = (x); \
if (FAILED(hr)) \
{ \
DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); \
} \
}
#else
#define CHECK_HRESULT(x) (x)
#endif
但我还想保存并返回 HRESULT 值,以便在免费构建中进行错误检查。所以基本上,我希望能够做类似的事情:
HRESULT hr = CHECK_HRESULT(Some_Function_Call());
这将为免费和检查版本的 hr 分配一个值,但是当为检查版本返回无效的 HRESULT 时也会显示一个对话框。是的,我知道我可以创建一个内联函数,但是我必须为 L#x
传递一个字符串,这意味着在我的代码中复制该语句两次,这是我想避免的事情(同样,当您尝试编写仅将 hr
作为输入的宏时,也会出现同样的问题)。我也想避免类似的事情:
#if defined(DEBUG) || defined(_DEBUG)
#define CHECK_HRESULT(x) (x); \
{ \
HRESULT hr = (x); \
if (FAILED(hr)) \
{ \
DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); \
} \
}
#else
#define CHECK_HRESULT(x) (x)
#endif
因为 x
很容易成为一个分配内存或做一些重要事情的函数,并且调用该函数两次会导致严重的不良行为,尤其是在检查和自由构建之间。此外,几乎不用说,我想避免假设已经有一个名为 hr 的 HRESULT...我之前已经走上了那条黑暗的道路。我确实意识到,在已检查的构建中默认分配一个值 S_OK
可能是安全的,因为该程序很可能无论如何都会崩溃,但这对我来说似乎很草率。
无论如何,谢谢你们的帮助!
最佳答案
你可以引入辅助函数:
#if defined(DEBUG) || defined(_DEBUG)
inline static HRESULT _Do_CheckHResult(HRESULT hr, const wchar* text, const wchar* file, DWORD line)
{
if (FAILED(hr))
{
DXTrace(file, line, hr, text, true);
}
return hr;
}
#define CHECK_HRESULT(x) _Do_CheckHResult(x, L#x, __FILE__, (DWORD)__LINE__)
#else
#define CHECK_HRESULT(x) (x)
#endif
(我从头到尾写的,它应该可以与复制粘贴一起使用,但我没有测试它)。
关于c++ - 使用宏进行赋值和错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938766/