Linux 上可用的 C 编译器是 GNU C 编译器,它建立在*软件基金会的编程许可证的基础上,因此可以*发布。GNU C 是对标准 C 进行的一系列扩展,以增强标准 C 的功能。
1. 零长度和变量长度数组
GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如:
struct var_data {
int len;
char data[0];
};
char data[0] 仅仅意味着程序中通过 var_data 结构体实例的 data[index] 成员可以访问 len 之后的第 index 个地址,它并没有为 data[] 数组分配内存,因此 sizeof(struct var_data) = sizeof(int)。
假设 struct var_data 的数据域就保存在 struct var_data 紧接着的内存区域,则通过如下代码可以遍历这些数据:
struct var_data s;
...
for(i=0; i<s.len; i++)
printf("%02x", s.data[i]);
GNU C 中也可以使用一个变量定义数组,例如下面代码中定义的 “double x[n]”:
int main(int argc, char *argv[])
{
int i, n = argc;
double x[n];
for(i=0; i<n; i++)
x[i] = i;
return 0;
}
2. case 范围
GNU C 支持 case x...y 这样的语法,区间 [x, y] 的数都会满足这个 case 的条件,请看下面的代码:
switch(ch) {
case '0'...'9' : c -= '0';
break;
case 'a'...'f' : c -= 'a' - 10;
break;
case 'A'...'F' : c -= 'A' - 10;
break;
}
参考自:《Linux 设备驱动开发》