gcc对C语言的扩展:语句内嵌表达式(statement-…

2008-02-23 05:41:25来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在GNU C 中,用括号将复合语句括起来也形成了表达式。他允许您在一个表达式内使用循环,跳转和局部变量。

一个复合语句是用大括号{}括起来的一组语句。在包含语句的表达式这种结构中,再用括号( )将大括号括起来,例如:
({ int y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })

就是个合法表达式,用于计算foo( )函数返回值的绝对值。
在上面的复合语句中,最后的一句必须是个以分号结尾的表达式。这个表达式代表了整个结构的值。假如您在大括号里的最后一句用的是其他的语句,则整个结构的返回类型为void,即没有合法的返回值。

这种特性使得宏定义变得更加安全(因为每个操作数都只被计算一次,例如 运算)。例如计算最大值通常在C语言中被定义为这样的宏:
#define max(a,b) ((a) > (b) ? (a) : (b))

但是其中的a和b可能会被计算两次,假如操作数带有副作用,则会产生错误的结果。在GNU C中,假如您知道了操作数的类型(假设为int),您能够这样安全的定义宏:
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
语句内嵌在常量表达式(例如枚举类型),位域尺寸或静态变量初始化中是不允许的。假如您不知道操作数的类型,您也能够使用typeof来获得类型。
语句表达式内嵌在G 中并不支持,而且将来是否支持现在也不清楚(他们在某时被完全支持或被抛弃掉,或作为bug会一直存在)。就现在而言,语句内嵌表达式在默认情况下工作的并不好。
此外,在C 中语句内嵌表达式还存在很多语义问题。假如您希望在C 中用语句内嵌表达式来代替内联函数(inline function),对象的析构处理可能会让您惊讶。例如:
#define foo(a) ({int b = (a); b 3; })
并不等同于
inline int foo(int a) { int b = a; return b 3; }
具体而言,当传递给foo的表达式的会引入临时对象的生成的时候,这些临时对象的析构在用宏时会早于用函数的情况。
以上情况说明在用于C 代码的.h头文档中使用语句内联表达式并不是个好主意。一些GNU C的库的某些版本中的使用语句内联表达式的头文档已造成了这样的bug。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: gcc对C语言的扩展:内嵌函数(Nested Function)

下一篇: gcc对C语言的扩展:局部标签声明(Locally Declared Labels)