引用: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的不同的更多相关文章

  1. GNU C 、ANSI C、标准C、标准c++区别和联系

    转载自点击打开链接 GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.它在编写linux的时候自己制作了一个标准成为 ...

  2. GNU C 与 ANSI C的区别

    1.零长度数组 GNU C允许使用零长度数组,定义变长度对象时比较方便 struct var_data { int len; char data[0]; }; var_data的大小仅为一个int型, ...

  3. GNU C 与 ANSI C(下)

    1. 语句表达式 GNU C 把包含在括号中的复合语句看做是一个表达式,称作语句表达式,它可以出现在任何允许表达式的地方.我们可以在语句表达式中使用原本只能在复合语句中使用的循环.局部变量等,例如: ...

  4. GNU C 与 ANSI C(上)

    Linux 上可用的 C 编译器是 GNU C 编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU C 是对标准 C 进行的一系列扩展,以增强标准 C 的功能. 1. 零长度 ...

  5. C11 (GNU Dialect) -std=gnu11 和 -std=c11

    C11 (GNU Dialect) -std=gnu11 和 -std=c11 C11 (GNU Dialect) -std=gnu11 和 -std=c11 用于 IntelliSense 的 C ...

  6. Linux驱动设计—— 内核模块(一)

    Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...

  7. GCC笔记

    The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可 ...

  8. [转] Linux中gcc,g++常用编译选项

    http://blog.sina.com.cn/s/blog_5ff2a8a201011ro8.html gcc/g++ 在执行编译时,需要4步 1.预处理,生成.i的文件[使用-E参数] 2.将预处 ...

  9. [整理]C 内核源代码-学习资料

    GNU C gnu项目:http://www.gnu.org/software/software.html ftp:http://ftp.gnu.org/gnu/ 托管:http://savannah ...

随机推荐

  1. JS获取昨天/今天/今年第一天的方法

    talk is cheap,show me the code! //获取昨天 var day1 = new Date(); day1.setTime(day1.getTime()-24*60*60*1 ...

  2. Adaboost入门教程——最通俗易懂的原理介绍(图文实例)

    https://blog.csdn.net/px_528/article/details/72963977 写在前面 说到Adaboost,公式与代码网上到处都有,<统计学习方法>里面有详 ...

  3. web 攻击靶机解题过程

    sql注入靶机攻击过程请参考 https://pentesterlab.com/exercises/from_sqli_to_shell/course http://www.sohu.com/a/12 ...

  4. 3.strcpy使用注意(3)

    void test3(char * str1) { if(str1==NULL) { return; } char string[10]; if(strlen(str1)<=10) { strc ...

  5. Disabling the Windows 8 UAC

    http://www.computerperformance.co.uk/win8/windows8-uac-disable.htm https://msdn.microsoft.com/en-us/ ...

  6. PHP parse_url 一个好用的函数

    array parse_url ( string $url ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分. 对严重不合格的 URL,parse_url() 可能 ...

  7. python安装大型包时出现错误Unable to find vcvarsall.bat

    在windows平台上,据说是安装cpython编写的包时会出现Unable to find vcvarsall.bat这种错误,缺失编译C的环境或组件吧,所以这个包就安装不成功,这个时候简单的方法就 ...

  8. Java通过继承外部类来建立该外部类的protected内部类的实例(转)

    原文链接:http://blog.sina.com.cn/s/blog_7de00ff60102xffx.html 如果想要在外部类的导出类(子类)中建立该外部类的为protected权限的内部类的实 ...

  9. PowerShell基础

    1. 一些命令像Get-SPSite有不同的参数变量.这些变量通过-?展示出来. Get-SPSite -? 2. F3 在当前行显示最近的一条命令结果 3. F7 显示之前执行过的命令列表 4. 显 ...

  10. iframe 问题集合

    1. 历史记录问题 Firefox: 如果iframe是静态存在在HTML中时,iframe的任何src或者location改变都会被记录到浏览器history中. 如果iframe是在页面加载完成后 ...