我不熟悉C ++,我不理解方法签名后的行:
int EAN13Reader::decodeMiddle(Ref<BitArray> row,
int startGuardBegin,
int startGuardEnd,
std::string& resultString)
{
(void)startGuardBegin;
...
}
什么是(void)startGuardBegin;
?方法调用?
答案 0 :(得分:4)
它告诉编译器该参数未使用,因此它不应显示“未使用的参数”警告。
虽然像GCC这样的编译器通常还有其他方式(int startGuardBegin __attribute__ ((unused))
)来指示这一点,但通常以某种方式在函数头中,将其转换为(void)
并不依赖于任何特定于编译器的功能。
答案 1 :(得分:3)
它没有做任何事情。
相反,它向读者和任何静态分析工具指定startGuardBegin
在函数中未使用,并且这是可以预期的。
如果参数在函数中未使用,静态分析工具将发出警告,因为这表示可能存在错误。如果无法从签名中删除该参数(如果它在调试代码中使用,或者是兼容性或将来的行为所必需),则在无效语句中使用该参数将阻止该警告。但是,只需在语句startGuardBegin;
中使用它就会触发另一个警告(因为该值被丢弃),因此将其强制转换为void
可以防止这种情况发生。
答案 2 :(得分:1)
转换为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());
所有表格均有效。我通常把它缩短为:
//suppressing expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);
它还可以。