为什么通过宏调用的内联错误函数不会返回main?

mit*_*llJ 0 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; }
Run Code Online (Sandbox Code Playgroud)

我正在调用以下宏:

int main()
{
    HRESULT hr = E_ACCESSDENIED;

    HR(hr);

    std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)

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

Vau*_*ato 5

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

int main()
{
    HRESULT hr = E_ACCESSDENIED;

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

    std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)

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