【问题标题】:C block becomes expression: ( {int a = 1; int b = 2; a+b;} ) equals 3C 块变成表达式: ( {int a = 1; int b = 2; a+b;} ) 等于 3
【发布时间】:2011-08-19 05:46:44
【问题描述】:

在阅读http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects 时,我遇到了这个例子:

\#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK?

您可以完全像函数一样使用它,即max(1,2) 是一个计算结果为 2 的表达式。

我的问题是,({ statment-list last-expression; }) 构造如何评估 last-expression 的值? 具体来说,这个构造的解析树是什么样的?我认为{ } 总是意味着复合语句,而语句没有值。我尝试在 C 语法中进行挖掘,但仍然无法解决这个问题。

【问题讨论】:

标签: c gcc macros c-preprocessor


【解决方案1】:

这是一个名为 Statement Expressions 的 GCC 扩展。这不是标准的 C。

【讨论】:

  • 语句表达式?!听起来很头疼。
  • 谢谢!当然,我实际上应该读过“typeof 关键字和在括号中放置复合语句的构造,都是在流行的 GNU C 编译器 (GCC) 中实现的非标准扩展”。哎呀。
  • 我喜欢它们。他们允许做这样的智能事情。 :)
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 2015-03-20
  • 2017-01-21
  • 2014-10-19
  • 2011-08-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多