我不熟悉 C++,也不理解方法签名之后的那一行:
int EAN13Reader::decodeMiddle(Ref<BitArray> row,
int startGuardBegin,
int startGuardEnd,
std::string& resultString)
{
(void)startGuardBegin;
...
}
是什么(void)startGuardBegin;
?方法调用?
我不熟悉 C++,也不理解方法签名之后的那一行:
int EAN13Reader::decodeMiddle(Ref<BitArray> row,
int startGuardBegin,
int startGuardEnd,
std::string& resultString)
{
(void)startGuardBegin;
...
}
是什么(void)startGuardBegin;
?方法调用?
它告诉编译器该参数未使用,因此不应显示“未使用参数”警告。
虽然诸如 GCC 之类的编译器通常有其他方式int startGuardBegin __attribute__ ((unused))
((void)
它什么也没做。
相反,它向读者和startGuardBegin
函数中未使用的任何静态分析工具指定这是可以和预期的。
如果函数中未使用参数,静态分析工具将发出警告,因为这表明可能存在错误。如果无法从签名中删除参数(如果它在调试代码中使用,或者是兼容性或未来行为所必需的),则在无效语句中使用参数将防止警告。但是,仅在语句中使用它startGuardBegin;
会触发另一个警告(因为该值被丢弃),因此将其强制转换以void
防止这种情况发生。
转换void
为用于抑制未使用的变量和未保存的返回值或表达式的编译器警告。
标准(2003)在 §5.2.9/4 中说,
任何表达式都可以显式转换为类型“cv void”。表达式值被丢弃。
所以你可以写(以 C++ 风格的方式):
//suppressing unused variable warnings
static_cast<void>(unusedVar);
//suppressing return value warnings
static_cast<void>(fn());
//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<void>( x &&y || z);
static_cast<void>( m | n + fn());
All forms are valid. I usually make it shorter as:
//suppressing expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);
Its also okay.