声明的目的是什么"(void)c;"?
What is the purpose of the statement "(void)c;"?
很抱歉标题很模糊,但不知道该怎么表达。所以我仔细查看了boost::asio的内部结构(试图追踪一些荒谬的延迟),我注意到像这样的代码点缀在:
op_queue<operation> completed_ops;
task_cleanup c = { this, &lock, &completed_ops };
(void)c; // EH?
现在,从正在初始化的结构的名称来看,我猜它是在使用RAII来执行一些销毁步骤——好吧,但最后一行的目的是什么?我是不是错过了一些非常时髦的东西?
也许是为了避免因为未使用c
而出现编译警告?
它之所以存在,可能是因为它是一种跨平台的方法,可以让编译器不抱怨未使用的变量。
这个问题可能是关于为什么使用,这个问题已经得到了回答。我将讨论它的含义(OP可能已经知道,但其他人可能不知道)。至少有一个其他问题已作为此问题的副本关闭。
通常,将表达式强制转换为void
会计算表达式并丢弃结果(如果有)。在这种情况下,表达式为c
,即类型为task_cleanup
的变量的名称(不管是什么)。
后跟分号的表达式是表达式语句。执行语句时,将对表达式求值,并丢弃其结果。
所以这个:
(void)c;
评估c
(由于c
只是一个非易失性声明对象,它只获取对象的值),然后丢弃结果,然后再次丢弃结果。
从语义上讲,这没有多大意义。你不妨写下:
c;
或者甚至完全省略它,具有完全相同的效果。
正如其他答案已经说过的那样,其目的是抑制未使用变量值的警告。如果没有强制转换,许多编译器将警告结果被丢弃。有了强制转换,大多数编译器都会认为有意丢弃该值,并且不会对此发出警告
这并不能保证;编译器可以对任何他们喜欢的东西发出警告。但是转换为void
是一个非常普遍的约定,大多数编译器都不会发出警告。
调用变量ignored
而不是c
可能是值得的,并且注释肯定会有所帮助。
相关文章:
- C++避免重复声明的语法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- 在将函数声明为友元时,尖括号的含义是什么?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- C++中这个声明的向量是什么意思
- boost::hana 转发声明标头的用例是什么?
- 在C++中,变量声明左侧的大括号是什么意思?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 引用 using 声明引入的功能的句子是什么意思?
- 以下声明C++中调用的函数的方法是什么?
- 这个嵌套结构声明是什么意思?
- 始终声明默认构造函数的优缺点是什么?
- 类名(声明)后的双冒号 - 这是什么意思
- 在模板类中编写朋友函数声明的正确方法是什么?
- 以下的 c# dll 导入声明是什么?
- 这是什么声明符