C++ VC C++;每次在宏中使用时执行/计算宏参数

C++ VC C++;每次在宏中使用时执行/计算宏参数,c++,macros,C++,Macros,我有一个检查错误状态的宏。如果有错误,它将记录结果并从方法中返回 CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;} 宏的名称如下所示: CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(&currentFile)); 但是,如果结果确实失败(hr),则再次执行该方法以执行LOGHR\u错误(hr)。我明白为什么我的StopRecord

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

CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;}
宏的名称如下所示:

CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(&currentFile));
但是,如果结果确实
失败(hr)
,则再次执行该方法以执行
LOGHR\u错误(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表达式。

有些东西,宏是邪恶的,创建函数,还有一些东西(更严重的是,我不确定这是否容易实现,如果可以的话)您是否可以发布代码,我们中的一些人无法查看图像。这看起来像是您试图对宏进行错误检查。你可以考虑一个<代码>尝试< /COD> >代码> catch <代码>块。如果将结果分配给局部变量,那就更好了。否则就很难阅读和调试了。@Cheersandhth.-Alf谢谢你对我答案的编辑,我已经有一段时间没有使用宏了,忘记了那个小技巧。我写了这个,但用了“\”让事情更清楚一些。检查我答案的更新。@PaulKnopf:do的大部分目的是能够编写
if(blahblah)宏();else{stuff;}
。当宏以分号结尾时,该操作将失败。因为这两个分号表示
if
后面的空语句,因此
else
断开连接。