7

可能重复:
在哪些版本的 c 中,括号内的块用于返回有效值?

以下是典型 MAX 宏的类型安全版本(适用于 gcc 4.4.5):

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
   __typeof__ (b) _b = (b); \
 _a > _b ? _a : _b; })

在这里,我们看到这个表达式 max(a,b) 返回了表达式的结果

_a > _b ? _a : _b;

即使这个表达式在一个块中。因此,我进行了调查,发现这是有效的 C:

int a = ({123;}); // a is 123

有人可以解释为什么这是有效的语法以及 ({statements}) 的真实行为是什么吗?此外,您会注意到 {123;} 不是有效的表达式,但只有 ({123;}) 是有效的。

4

1 回答 1

16

它不是有效的 C99 或 C89 或 C++。它是 gcc 扩展,称为“语句表达式”。使用 gcc 添加选项验证 C 代码-ansi -pedantic。也有用的选项是-W -Wall -Wextra

语句表达式的文档在这里http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

这个 gnu 扩展在 GNU 代码和 Linux 中被广泛使用,因此它不仅被 GCC 支持,而且在现代编译器如 Intel C++ 编译器、Sun Studio、LLVM+clang、...

于 2010-12-17T23:57:57.340 回答