【问题标题】:What is the purpose of the statement "(void)c;"?语句“(void)c;”的目的是什么?
【发布时间】:2011-05-26 21:51:43
【问题描述】:

抱歉标题含糊不清,但不确定如何表达。所以我查看了 boost::asio 的内部结构(试图找出一些荒谬的延迟),我注意到这样的代码点缀着:

    op_queue<operation> completed_ops;
    task_cleanup c = { this, &lock, &completed_ops };
    (void)c;  // EH?

现在从正在初始化的结构的名称来看,我猜它正在使用 RAII 来执行一些销毁步骤 - 很好,但是最后一行的目的是什么?我是不是错过了一些非常时髦的东西?

【问题讨论】:

  • @hammar :我不认为他在问为什么这是一个 noop,我认为他是在问为什么要打扰这个声明。
  • @ildjarn,正确 - 现在回想起来,觉得自己很愚蠢..怪罪于睡眠不足..:
  • 为什么不问问是谁写的?
  • @Neil Butterworth,这不是一个特定于 asio 的问题,克里斯为什么要费心回答?这是一个关于特定语法的问题,显然有一个简单的解释——这让我在睡眠不足的状态下无法理解......

标签: c++


【解决方案1】:

也许是为了避免编译警告,因为c 没有被使用?

【讨论】:

  • 是否有可能一个过度优化的编译器也可以优化 c 的构造/破坏,因为它从未使用过?或者这只能发生在原始类型上?
  • 没错。而且我相信强制转换为 (void) 是为了避免来自 lint 的警告,信不信由你。
  • @Wyatt Anderson,我怀疑编译器不可能预测构造函数/析构函数的所有副作用,尤其是。如果它们不重要。
【解决方案2】:

可能是因为它是一种跨平台的方法,可以让编译器不抱怨未使用的变量。

【讨论】:

    【解决方案3】:

    这个问题可能是关于为什么使用它,并且已经得到了回答。我将谈论它的含义(OP 可能已经知道,但其他人可能不知道)。至少一个其他问题已作为此问题的副本关闭。

    一般来说,将表达式转换为void 会计算表达式并丢弃结果(如果有)。在这种情况下,表达式为c,即task_cleanup 类型的变量的名称(无论是什么)。

    后跟分号的表达式是表达式语句。当语句被执行时,表达式被计算并且其结果被丢弃。

    所以这个:

    (void)c;
    

    评估c(因为c 只是一个非易失性声明对象,只是获取该对象的值),然后丢弃结果,然后丢弃结果再次

    从语义上讲,这没有多大意义。你不妨写:

    c;
    

    甚至完全省略它,效果完全相同。

    正如其他答案已经说过的那样,目的是抑制未使用变量值的警告。如果没有强制转换,许多编译器会警告结果被丢弃。使用强制转换,大多数编译器会假设您故意丢弃该值,并且不会发出警告。

    这不是保证;编译器可以警告他们喜欢的任何事情。但是强制转换为 void 是一个足够广泛的约定,大多数编译器不会发出警告。

    调用变量ignored 而不是c 可能是值得的,评论肯定会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2016-03-31
      相关资源
      最近更新 更多