短篇小说是我想要这种行为:
#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());
这将为免费和检查构建分配一个值,但当检查构建返回无效的 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
在检查的构建中默认分配一个值可能是安全的,因为程序很可能无论如何都会崩溃,但这对我来说似乎很草率。
无论如何,谢谢你们的帮助!