C块变为表达式:({int a = 1; int b = 2; a + b;})等于3

时间:2011-08-19 05:46:44

标签: c gcc macros c-preprocessor

在阅读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 语法进行挖掘,仍然无法解决这个问题。

1 个答案:

答案 0 :(得分:10)

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

相关问题