简短的故事是我想要这种行为:
#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
可能是安全的,因为程序很可能会崩溃,但这对我来说似乎很草率。
无论如何,谢谢你的帮助!
答案 0 :(得分:3)
您可以介绍帮助函数:
#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
(我是从头顶写的,它可能适用于复制粘贴,但我没有测试过它。)
答案 1 :(得分:0)
gcc有一个扩展,允许在表达式中使用完整的代码块,但我假设你需要这个用于VC ++?在这种情况下,您可以定义一个宏“CHECK_ASSIGN_HRESULT(v,x)”进行检查,但也将结果分配给v?