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(¤tFile)); 但是,如果结果确实失败(hr),则再次执行该方法以执行LOGHR\u错误(hr)。我明白为什么我的StopRecord
CHECKHR_FAILED_RETURN(hr) if(FAILED(hr)){LOGHR_ERROR(hr); return hr;}
宏的名称如下所示:
CHECKHR_FAILED_RETURN(_recordingGraph->StopRecording(¤tFile));
但是,如果结果确实失败(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
断开连接。