声明“(void)startGuardBegin;”是做什么的?

时间:2012-06-18 08:38:43

标签: c++

  

可能重复:
  What does “(void) new” mean in C++?

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

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

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

3 个答案:

答案 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);

它还可以。