2

因此,我看到了许多线程解释如何避免未引用的参数警告,例如:

避免警告“未引用的形式参数”
C++ 强制转换为 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);
}

从编译器将做什么的角度来看,我对此最感兴趣,但是如果您对一种方法比其他方法强烈感觉,我也很高兴听到这些论点。

4

2 回答 2

2

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

第一个选项,保留参数未命名,是可以接受的,但通常为参数命名以用于调试目的很有用(例如,即使您没有在函数中使用参数,您也可能对它的值感兴趣调试时)。但是,在某些情况下,此选项很好,例如在执行标记调度时。

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

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

通过转换xvoidvia (void)x;,此警告将被抑制。(请注意,此警告默认关闭;此警告必须通过#pragma或命令行选项明确启用。)

于 2013-04-21T18:16:43.797 回答
0

我看不出编译器为什么会区别对待任何这些。但是确定编译器的唯一方法是查看编译器的输出。

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

于 2013-04-14T20:48:47.723 回答