GNU C与ANSI C的不同

引用:http://tsroad.lofter.com/post/376316_57ac519

1.GNU C可定义0长度数组,目的是为了定义可变长结构体。 
           

struct var_struct
{
   int len;
   char data[0];
};

把此结构体的数据紧接着放后面,就可以用data[index]来访问了。 

2.case可以范围匹配,case x...y 

switch(n)
{
   case 0...9 c=1;break;
   case 10...11 c=2;break;
   ...
}


3.GNU C把大括号中的语句看成一个表达式,可以出现在任何表达式能出现的地方 

#define int_min(x,y) 
 {int __x=(x);int __y=(y);__x<__y?__x:__y;}


4.typeof关键字,可以得到变量的类型 

int x;
typeof(x) y;


5.支持可变参的宏 

#define dprint(fmt,arg...) 
printk(fmt,##arg)


6.当前函数名,使用宏__FUNCTION__ 

7.在初始化结构体或数组时,通过索引和结构体名,允许初始化值以任意顺序出现。 

int s[5]={[0 ... 3]=3,[4]=1};

注意[0空格...空格3] 

struct x
{
   int a;
   char b;
};
struct x y=
{
   .b='h',
   .a=10,
};



8.允许声明函数,变量,类型的特殊属性,只要在后面加上__atribute__((属性)) 

#define ATTRI_NORETURN __attribute__((noreturn))

void exit() ATTRI_NORETURN
{
  ...
}


9.GNU C提供了大量的内建函数 

10.用do ... while(0)来定义宏,这样做是为了方便在宏后面加;号 

#define XXX do{free(p);p=NULL;}while(0)


11.经常用goto语句进行错误处理。 

以上内容来自《Linux设备驱动开发详解》。

原文地址:https://www.cnblogs.com/xubeiping0930/p/4466008.html