2012-06-18 65 views
6

可能重复:
What does “(void) new” mean in C++?声明“(void)startGuardBegin;”做什么?

我不熟悉C++和我的方法签名后立即不懂行:

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

什么(void)startGuardBegin; ?一个方法invokation?

+0

@ThiefMaster不是重复的,略有不同的使用'void':丢弃值与标记变量为未使用。 –

+1

不重复。 –

回答

4

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

尽管GCC等编译器通常以其他方式(int startGuardBegin __attribute__ ((unused)))来指示此操作,通常以某种方式在函数标题中将其转换为(void)并不依赖于任何编译器特定的功能。

3

它什么也没做。

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

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

+0

实际上,在大多数情况下,它是编译器,而不是其他一些静态分析工具。 – ThiefMaster

1

铸造到void用于抑制未使用的变量和未保存的返回值或表达式的编译器警告。

标准(2003)说,在§5.2.9/ 4说,

任何表达式可以显式转换为类型“CV空隙。”表达值是丢弃

所以,你可以写(在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); 

它也没关系。

相关问题