语句“(void)startGuardBegin;”有什么作用

What does the statement “(void)startGuardBegin;” do?

本文关键字:什么 作用 startGuardBegin void 语句      更新时间:2023-10-16

可能的重复项:
"(无效)新"在C++中是什么意思?

我不熟悉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,并且这是正常的和预期的。

如果函数中未使用参数,静态分析工具将发出警告,因为这表示可能存在错误。 如果无法从签名中删除参数(如果在调试代码中使用参数,或者兼容性或将来的行为需要该参数),则在 no-effect 语句中使用该参数将阻止警告。 但是,仅在语句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()); 

所有表格均有效。我通常将其缩短为:

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

也没关系。