码迷,mamicode.com
首页 > 其他好文 > 详细

GNU C与ANSI C的不同

时间:2015-04-29 16:31:01      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

引用: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设备驱动开发详解》。

 

GNU C与ANSI C的不同

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!