每次在宏中使用时,VC C ++宏参数都会被执行/评估

时间:2014-11-06 16:47:16

标签: c++ macros

我有一个检查错误状态的宏。如果有错误,它会记录结果并返回方法。

CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;}

宏的调用如下:

CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(&currentFile));

但是,如果结果确实为FAILED(hr),则再次执行该方法以执行LOGHR_ERROR(hr)。我知道为什么我的StopRecording会在出现错误时被调用两次,所以我的问题是......

如何评估宏中参数的结果,但在同一个宏中多次使用它?

更新

根据以下建议,我将宏更改为以下内容。

#define CHECKHR_FAILED_RETURN(hr) do { \
    HRESULT result = hr; \
    if(FAILED(result)) \
    { \
        LOGHR_ERROR(result); \
        return result; \
    } \
} while (false);

#define CHECKHR_FAILED(hr) do { \
    HRESULT result = hr; \
    if(FAILED(result)) \
    { \
        LOGHR_ERROR(result); \
        return true; \
    } \
    else \
    { \
        return false; \
    } \
} while (false);

1 个答案:

答案 0 :(得分:1)

正如一位评论者所说,在每个可能的地方都喜欢使用宏功能。在这种情况下,它是不可能的,因为您想在代码中嵌入return

您可以对宏中的临时变量进行赋值,并使用它而不是多次调用该参数。

#define CHECKHR_FAILED_RETURN(hr) do{ HRESULT hr2=hr; if(FAILED(hr2)) {LOGHR_ERROR(hr2); return hr2; }}while(false)

do循环是一个习惯用法,确保宏可以在if - else中使用,就像函数调用一样。使用C ++ 11及更高版本,您也可以使用lambda表达式。