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

Will the compiler do different things depending on how I handle unreferenced parameters?

本文关键字:参数 方式做 不同的事 引用 处理 编译器      更新时间:2023-10-16

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

避免警告';未引用的形式参数'
C++铸造空心的目的是什么?

但我想知道的是,编译器是否会根据使用的方法做任何不同的事情。例如,以下三种情况的编译输出会有什么不同吗?

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

从编译器将要做什么的角度来看,我对此最感兴趣,但如果你强烈支持一种方法而不是其他方法,我也很乐意听到这些论点。

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

第一个选项是不命名参数,这是可以接受的,但通常情况下,参数有一个名称用于调试是很有用的(例如,即使您没有在函数中使用参数,在调试时也可能对其值感兴趣(。不过,在某些情况下,这个选项是可以的,例如在进行标记调度时。

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

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

通过(void)x;x强制转换为void,可以抑制此警告。(请注意,此警告在默认情况下是关闭的;必须通过#pragma或命令行选项明确启用此警告。(

我看不出编译器为什么会处理这些不同的问题。但唯一能确定编译器的方法是查看编译器的输出。

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