Linux上使用的C编译器是GNU C编译器,其对标准的C(ansi c)进行了一定的扩展,这带来的影响是两方面的。一方面增强了其原来的没有的功能,另一方面却对要编写移植性要求较高的程序带来了一些问题。对于后一个问题,在编写程序时,建议是如果在ANSI C中也提供的同样的功能时,尽量使用ANSI C来实现,当然如果不考虑程序的移植性,比如说,我们就是要在一个产品上写一段代码,那就不需要考虑这些了,但是如果要想写一个通用的库,这是应该考虑的。笔者原来很少考虑GNU C与ANSI C之间的区别,最近开了一个文章,感觉这些还是比较重要的,简要把GNU C中一些特别多罗列在下面。其中有几部分我在网上找到的参考文章,非常好,贴出链接。
1、变量长度数组。
在标准C中,我们都知道实例化一个数组的时候,其大小必须是常量。GNU C可以使用一个变量的数值来实例化一个数组。例如,下面的程序是正确的。
int i=10;
char aa[i];
2、零长度数组。
数组长度可以是0吗?很多人一听到认为当然不可以,这完全没有意义嘛。。GNU C中是可以的,但是其并不是表示这个数组的长度为0,这只是一种表现形式,其意义完全不是说这个数组的长度是0长度。例如:
struct var_d{
int len;
char data[0];
};
这种表现形式一般用在可变长度的BUFF上,你会发现sizeof(struct var_d)==sizeof(int),这就说明了data是不占任何空间的。其实data就是一个常量指针,指向指向用上述结构体实例化对象所占内存空间的下一个地址,其用法一般如下:
struct var_data *thisline;
thisline =(struct var_data *)malloc(sizeof(struct var_data)+10);