2010-12-17 63 views
7

可能重复:
in what versions of c is a block inside parenthesis used to return a value valid?为什么这个有效的C? ---({123;})的计算结果为123

下面是一个典型的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 

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

+3

Dupes:[Oct 2009](http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside -parenthesis-used-to-return-a-value-valid)[2010年5月](http://stackoverflow.com/questions/2892981/weird-initialization-in-c)[2010年1月](http:// stackoverflow .com/questions/2075930/more-information-on-in-c) – 2010-12-18 00:12:30

回答

16

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

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

这GNU扩展广泛用于GNU代码和Linux,所以它不仅得到GCC,而且在现代编译像英特尔C++编译器,Sun Studio,LLVM +铛,...

+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 2010-12-18 00:10:43

+0

@pmg,如果您知道,下一个标准中会包含“语句表达式”吗? – osgx 2010-12-18 00:12:33

+2

嗯......这个[open-std站点上的PDF](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf)提示“语句表达式”成为标准一段时间。 – pmg 2010-12-18 00:19:37

相关问题