我有一个检查错误状态的宏。如果有错误,它会记录结果并返回方法。
CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;}
宏的调用如下:
CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(¤tFile));
但是,如果结果确实为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);
答案 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表达式。