【问题标题】:More information on `({});` in C?更多关于 C 中 `({});` 的信息?
【发布时间】:2010-01-16 02:03:55
【问题描述】:

我注意到有时,C 宏是这样写的:

#define foo(bar) ({ ++bar; })

经过一些实验,我发现:

  1. ({}); 将编译,但什么也不做。 (正如预期的那样。)
  2. 关闭; 将导致语法错误。这样做的副作用是确保 foo() 在您的代码中看起来像一个函数。 (不过,如果您不使用分号,则该错误对于诊断问题不是很有用!)
  3. return ({}); 抱怨 void 值未被忽略,就像我尝试使用 void 函数一样。

这只是为了让开发人员在他们的宏中添加分号,还是有其他目的?我试过谷歌,但标点符号失败了。有这个名字吗?

【问题讨论】:

    标签: c gcc macros


    【解决方案1】:

    这是一个名为 statement expressions 的 GNU 扩展。

    在标准-C 中声明宏时,您经常会看到do...while(0) 循环用于类似目的(即创建块作用域)。语句表达式优于循环黑客,因为它可以返回一个值。如果你想在标准 C 中做类似的事情,你必须定义一个额外的函数,并且失去了词法作用域的便利。

    【讨论】:

      【解决方案2】:

      语句表达式很酷的地方(如果有很酷的话)是最后一个语句是表达式的结果。

      #define foo(bar) ({ ++bar; 3.1415927; })
      
      int i = 0;
      float pi = foo(i);
      

      【讨论】:

        【解决方案3】:

        () 是一个表达式。 ({code; code;}) 是表达式内的复合语句。那是一个 GNU C 扩展。

        http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

        编辑:哇,我从 Google 获得了那个链接,一开始并没有注意到它是针对 gcc 2.95 的。古代!

        【讨论】:

        • 古代 - 但 4.4.2 仍支持该语法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多