zoukankan      html  css  js  c++  java
  • 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设备驱动开发详解》。

  • 相关阅读:
    jvm调优
    Spring 事务
    Spring Framework入门介绍
    redis入门介绍
    Spring与SpringMVC重复扫描问题
    跨域相关问题
    Spring MVC介绍
    Servlet、Servlet容器
    获取屏幕宽高
    mybatis中比较符的写法
  • 原文地址:https://www.cnblogs.com/xubeiping0930/p/4466008.html
Copyright © 2011-2022 走看看