gcc扩展语法一:在表达式中的语句和声明

在GNU C中包含在括号中的复合语句可以作为一个表达式。这就允许你在表达式中使用循环,switch和局部变量。

以前复合语句是包含在大括号中语句序列。在这种构造中,圆括号包围在大括号中。如下面的例子:

({ int y = foo(); int z;

  if ( y > 0 )  z = y;

  else  z = -y; 

     z;

})

上面的例子是一个有效的表达式。在复合语句构造中的最后一部分应该是一个表达式后面跟一个分号,这个子表达式的值充当整个复合语句构造的值。如果你使用的是其他类型的语句放在括号中的最后面,那么这个复合语句构造的类型为void类型,也就是没有返回值。

这种复合语句构造对于宏定义安全特别有用。比如下面的例子:

  #define max(a,b)     ( (a) > (b) ? (a) : (b) )

  在上面的例子中a或者b的计算会进行两次,如果这种计算操作会产生副作用,那么会产生坏的结果。

  但是在GNU C中,你可以使用下面的方式,如果你知道a和b的类型的话,假设都为整型:

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

  如果不知道a和b的类型的话,那么可以使用typeof语句,如下:

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

这样就可以减少计算次数

这种嵌套的语句不允许在常量表达式中。

原文地址:https://www.cnblogs.com/linghuchong0605/p/3838430.html