c++ - 为什么这个通过宏调用的内联错误函数没有返回到main?

标签 c++ macros

我正在使用头文件定义内联函数,以便通过使用宏将 HRESULTS 转储到即时窗口。

来自 https://www.sellsbrothers.com/writing/a_young_person.htm :

#define lengthof(rg) (sizeof(rg)/sizeof(*rg))

inline const char* StringFromError(char* szErr, long nSize, long nErr)
{
    _ASSERTE(szErr);
    *szErr = 0;
    DWORD cb = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErr, 0, szErr, nSize, 0);
    char szUnk[] = "<unknown>";
    if (!cb && nSize >= lengthof(szUnk)) lstrcpyA(szErr, szUnk);
    return szErr;
}

inline void TraceHR(const char* pszFile, long nLine, HRESULT hr)
{

        char szErr[128];
        char sz[_MAX_PATH + lengthof(szErr) + 64];
        wsprintf(sz, "%s(%d) : error 0x%x: %s\n", pszFile, nLine, hr,
            StringFromError(szErr, lengthof(szErr), hr));
        OutputDebugString(sz);
        return;
}

#ifdef _DEBUG
#define TRACEHR(_hr) TraceHR(__FILE__, __LINE__, _hr)
#else
#define TRACEHR(_hr) _hr
#endif

#define HR(ex) { HRESULT _hr = ex; if(FAILED(_hr)) return TRACEHR(_hr), _hr; }

我从以下位置调用宏:

int main()
{
    HRESULT hr = E_ACCESSDENIED;

    HR(hr);

    std::cin.get();
}

我发现 HR(hr) 永远不会返回到 main,所以 std::cin.get() 永远不会被调用。这是预期的行为还是我误解/错误地实现了这个功能? 这段代码中是否存在调用堆栈展开而不是允许处理 HR 的机会?

最佳答案

当您使用宏时,它只是一个简单的文本替换。所以你的主要变成:

int main()
{
    HRESULT hr = E_ACCESSDENIED;

    { HRESULT _hr = hr; if(FAILED(_hr)) return TRACEHR(_hr), _hr; };

    std::cin.get();
}

由于 return 语句周围的大括号不会阻止它返回,returnmain()std 退出::cin.get() 未被调用。

关于c++ - 为什么这个通过宏调用的内联错误函数没有返回到main?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837196/

相关文章:

c++ - 同名类和变量的定义

c++ - 从由函数填充的字符串的推导 vector 中将字符串转换为 int

c++ - 宏可以在 #if 中与非数值进行比较吗

c - 在 C 中为宏使用预处理器语句

c - C offsetof 宏如何工作?

rust - 如何提供可选泛型作为 macro_rules 参数?

c++ - Qt 中类层次结构的异常处理

c++ - 将具有 150 多个变量的 C++ 类转换为 Json 对象

c++ - 管道优化,这样做有什么意义吗?

C 中的大小写可变宏