c++ - 使用宏进行赋值和错误检查

标签 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 可能是安全的,因为该程序很可能无论如何都会崩溃,但这对我来说似乎很草率。

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

最佳答案

你可以引入辅助函数:

#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/

相关文章:

c++循环永远运行而无需等待输入

c++ - 我可以在Linux上获得最佳的时间分辨率

c++ - 如何将类中的函数作为参数传递给 C++11 中同一类中的另一个函数?

具有灵活参数的 C 宏

c++ - 结合 C++ 和 C

c++ - 实现视频编辑器

windows - D3D11_USAGE_STAGING,使用什么样的GPU/CPU显存?

c++ - 如何在 C++ 中创建结构的实例?

我们可以在c语言中创建一个不定义宏#define吗

c - 一元运算有时是自杀性的。弄乱 C 代码