使用宏进行分配和错误检查

时间:2012-12-18 17:58:28

标签: c++ macros directx direct3d

简短的故事是我想要这种行为:

#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可能是安全的,因为程序很可能会崩溃,但这对我来说似乎很草率。

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

2 个答案:

答案 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?