GNU C相关特性
本文主要参考《Using the GNU Compiler Collection》, 介绍一下GNU C的一些特性。
1. 零长度数组
在GNU C中允许零长度数组, 其经常作为一个结构体的最后一个元素,用于指示一个可变长object的头:
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length);
thisline->length = this_length;在ISO C90版本中,你必须给上面contents成员指定长度为1, 但这样会导致浪费一个字节的空间或者使malloc()函数参数复杂化。
在ISO C99版本中,你可以使用一个柔性数组(flexible array member),但是其在语法和语义上面还是与零长度数组有一些不同:
-
柔性数组的写法为
contents[], 并没有上面的长度0 -
柔性数组是一个不完整类型,因此不能使用
sizeof操作符。而巧合的是,对于零长度数组其原始实现就支持sizeof为0 -
柔性数组只能为struct的最后一个成员变量
-
如果一个结构体或联合(union)包含一个柔性数组成员,那么该结构体或联合(union)不能为另外一个结构体的成员,也不能是一个数组的元素
[参考]

