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

VC C++ macro parameters getting executed/evaluated each time used in macro

本文关键字:执行 评估 VC 参数 C++      更新时间:2023-10-16

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

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);

正如一位评论者所说,在任何可能的地方,都更喜欢函数而不是宏。在这种情况下,这是不可能的,因为您希望将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表达式。