每次在宏中使用时,都会执行/评估VC C++宏参数
VC C++ macro parameters getting executed/evaluated each time used in macro
我有一个宏来检查错误状态。如果出现错误,它会记录结果并从方法中返回。
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);
正如一位评论者所说,在任何可能的地方,都更喜欢函数而不是宏。在这种情况下,这是不可能的,因为您希望将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表达式。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- std::condition_variable::wait()如何评估给定的谓词
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- OR 语句执行所有评估
- 单步执行函数,但不进入VS2017的参数评估
- 每次在宏中使用时,都会执行/评估VC C++宏参数