编译器会根据我处理未引用参数的方式做不同的事情吗
Will the compiler do different things depending on how I handle unreferenced parameters?
因此,我看到了许多线程解释如何避免未引用的参数警告,例如:
避免警告';未引用的形式参数'
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
或命令行选项明确启用此警告。(
我看不出编译器为什么会处理这些不同的问题。但唯一能确定编译器的方法是查看编译器的输出。
我更喜欢第一个选项,因为这种情况(未使用的参数(正是该语言功能的设计目的。
相关文章:
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- C++:如何做一个链表,结构作为参数传递?
- 没有大小参数的CString::GetBuffer()做什么
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 将函数作为参数传递的两种方式之间的区别
- C++17 中函数参数的指针对齐方式
- "A类"调用的这个参数在做什么?
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 模板参数是哪些类型的值?我能(不)用它们做什么
- 在 main() 中传递C++命令行参数,但要做同样的工作
- 使用按插入方式排序的参数创建哈希映射
- 如何以有效的方式将输入参数传递给函数
- 有什么优雅的方式吗?(类型参数包)
- 一种体面的方式来转换const列表参考参数,然后传递到另一个函数
- 以可变参数方式绑定成员函数
- 为什么 boost/etc 对模板成员函数的参数类型做这么多 SFINAE?
- c++中的(..)参数是做什么的
- 编译器会根据我处理未引用参数的方式做不同的事情吗
- 最快的方式做关键字搜索在大文本在C/ c++