7

可能重复:
“(void) new”在 C++ 中是什么意思?

我不熟悉 C++,也不理解方法签名之后的那一行:

int EAN13Reader::decodeMiddle(Ref<BitArray> row,
        int startGuardBegin,
        int startGuardEnd,
        std::string& resultString)
{
    (void)startGuardBegin;
    ...
}

是什么(void)startGuardBegin;?方法调用?

4

3 回答 3

4

它告诉编译器该参数未使用,因此不应显示“未使用参数”警告。

虽然诸如 GCC 之类的编译器通常有其他方式int startGuardBegin __attribute__ ((unused))(void)

于 2012-06-18T08:44:20.070 回答
3

它什么也没做。

相反,它向读者和startGuardBegin函数中未使用的任何静态分析工具指定这是可以和预期的。

如果函数中未使用参数,静态分析工具将发出警告,因为这表明可能存在错误。如果无法从签名中删除参数(如果它在调试代码中使用,或者是兼容性或未来行为所必需的),则在无效语句中使用参数将防止警告。但是,仅在语句中使用它startGuardBegin;会触发另一个警告(因为该值被丢弃),因此将其强制转换以void防止这种情况发生。

于 2012-06-18T08:45:31.207 回答
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()); 

All forms are valid. I usually make it shorter as:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

Its also okay.

于 2012-06-18T09:09:58.290 回答