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