声明的目的是什么"(void)c;"?

  • 本文关键字:是什么 声明 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可能是值得的,并且注释肯定会有所帮助。

最新更新