编译器会根据我处理未引用参数的方式做不同的事情吗?

时间:2013-04-14 20:46:12

标签: c++ compiler-warnings compiler-optimization suppress-warnings

所以我看过许多线程解释如何避免未引用的参数警告,例如:

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);
}

从编译器的作用来看,我最感兴趣的是,但如果你对其他方法的态度强烈,我也很高兴听到这些论点。

2 个答案:

答案 0 :(得分:2)

在三者中,最后一个选项(void)x;在大多数情况下更为可取。

第一个选项,保留参数未命名,是可以接受的,但是参数通常有一个名称用于调试目的(例如,即使你没有在函数中使用参数,你可能会感兴趣在调试时的值)。但是,有些情况下这个选项很好,例如在做tag dispatching时。

第二个选项x;可能会导致其他警告。 Visual C ++将为此代码发出警告C4555:

warning C4555: expression has no effect; expected expression with side-effect

通过xvoid投射到(void)x;,此警告会被取消。 (请注意,默认情况下此警告处于关闭状态;必须通过#pragma或命令行选项明确启用此警告。)

答案 1 :(得分:0)

我看不出编译器会处理任何不同的原因。但是,确定编译器的唯一方法是查看编译器的输出。

我更喜欢第一个选项,因为这种情况(未使用的参数)是该语言功能的设计目的。