0

短篇小说是我想要这种行为:

#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在检查的构建中默认分配一个值可能是安全的,因为程序很可能无论如何都会崩溃,但这对我来说似乎很草率。

无论如何,谢谢你们的帮助!

4

2 回答 2

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

(我是从头顶写的,它应该可以与复制粘贴一起使用,但我没有测试过)。

于 2012-12-18T18:02:49.443 回答
0

gcc 有一个扩展名,允许表达式中的完整代码块,但我假设你需要这个用于 VC++?在这种情况下,您能否定义一个宏“CHECK_ASSIGN_HRESULT(v,x)”来进行检查,同时将结果分配给 v?

于 2012-12-18T18:04:29.123 回答