前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。
帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions
在讲解新概念之前,先回顾一下在标准C中表达式和复合语句的概念,表达式指的是运算符和操作数的组合,而复合语句指的是由一个或多个被括在花括号里的语句构成的代码块。
在GNU C中,允许用小括号括起来的复合语句出现在一个表达式中。
举例,如清单1:
#include <stdio.h>
int main(void)
{
int a = ({ int b = 8;
int c = 99;
b + c;
b + c - 10;
});
printf("a = %d\n", a);
return 0;
}
例子输出结果:
a = 97
注意,例子中a的值是复合语句中最后一个语句的值,并且它的数据类型与最后一个语句的数据类型相匹配。
这种特性(Statements and Declarations in Expressions)在Linux内核中常被用于宏的定义中。
举例,如清单2:
/* linux-2.6.38.8/include/linux/kernel.h */
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
/* linux-2.6.38.8/include/linux/kernel.h *
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
* @x: value1
* @y: value2
*/
#define min_not_zero(x, y) ({ \
typeof(x) __x = (x); \
typeof(y) __y = (y); \
__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
#include <stdio.h>
int main(void)
{
printf("min_not_zero(4, 0) = %d\n", min_not_zero(4, 0));
printf("min_not_zero(\'\\0\', \'a\') = %c\n", min_not_zero('\0', 'a'));
return 0;
}
例子输出结果:
min_not_zero(4, 0) = 4
min_not_zero('\0', 'a') = a