为什么 ({123;}) 能被视为有效的 C 代码? --- ({123;}) 的结果为 123。

7
以下是一个类型安全的典型MAX宏的版本(在gcc 4.4.5上有效):

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

注:MAX宏是一个常见的宏定义,用于取两个数中的最大值。此处的类型安全版本是指使用了一些技巧,使得不会出现类型不匹配的问题。
#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
以下是需要翻译的内容: Dupes: Oct 2009 May 2010 Jan 2010以下是翻译的结果: 重复问题:2009年10月 2010年5月 2010年1月 - Martin York
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等现代编译器支持。


1
目前(gcc 4.4.5),对于C语言,“-ansi”等同于“-std=c89”(对于C++,则是“-std=c++98”)。一些其他有用的选项包括“-std=c99”、“-std=gnu89”、“-std=gnu99”、“-std=c++0x”、“-std=gnu++0x”。 - pmg
@pmg,如果您知道,“statement exprs”是否会包含在即将发布的标准中? - osgx
2
哦...这个open-std网站上的PDF暗示“语句表达式”将在某个时候成为标准。 - pmg
@pmg,谢谢。这是一份相当古老的PDF文件(2007-03)。我将尝试联系一些参加C/C++标准会议的人。 - osgx
@Laurence Gonsalves,是的,但LLVM/clang和LLVM/GCC是。 - osgx
@osgx:我没有看到任何迹象表明他们会这样做。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接