当前位置:主页   - 电脑 - 程序设计 - C/C++
gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)
来源:网络   作者:   更新时间:2012-05-13
收藏此页】    【字号    】    【打印】    【关闭

  在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。

  文章来源: http://nathanxu.blog.51cto.com/50836/6027

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明