GNU C 与 ANSI C(上)

时间:2021-04-11 03:19:17

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 设备驱动开发》