所以我看过许多线程解释如何避免未引用的参数警告,例如:
Avoid warning 'Unreferenced Formal Parameter'
C++ What is the purpose of casting to void?
但我想知道的是编译器是否会根据使用的方法做任何不同的事情。例如,以下三种情况的编译输出是否会有所不同?
void Method(int /*x*/)
{
// Parameter is left unnamed
}
void Method(int x)
{
x; // This would be the same as UNREFERENCED_PARAMETER(x);
}
void Method(int x)
{
(void)x; // This would be the same as _CRT_UNUSED(x);
}
从编译器的作用来看,我最感兴趣的是,但如果你对其他方法的态度强烈,我也很高兴听到这些论点。
答案 0 :(得分:2)
在三者中,最后一个选项(void)x;
在大多数情况下更为可取。
第一个选项,保留参数未命名,是可以接受的,但是参数通常有一个名称用于调试目的(例如,即使你没有在函数中使用参数,你可能会感兴趣在调试时的值)。但是,有些情况下这个选项很好,例如在做tag dispatching时。
第二个选项x;
可能会导致其他警告。 Visual C ++将为此代码发出警告C4555:
warning C4555: expression has no effect; expected expression with side-effect
通过x
将void
投射到(void)x;
,此警告会被取消。 (请注意,默认情况下此警告处于关闭状态;必须通过#pragma
或命令行选项明确启用此警告。)
答案 1 :(得分:0)
我看不出编译器会处理任何不同的原因。但是,确定编译器的唯一方法是查看编译器的输出。
我更喜欢第一个选项,因为这种情况(未使用的参数)是该语言功能的设计目的。