首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写linux的时候自己制作了一个标准成为 GNU C标准。ANSI 美国国家标准协会,它对C做的标准ANSI C标准后来被国际标准协会接收成为 标准C 所以 ANSI C 和标准C是一个概念。总体来说现在linux也支持标准C,以后标准C可以跨平台,而GUN c 一般只在linux c下应用

ANSI C和标准C++的差别
这里的ANSI C指的是最新的标准-C99
1、ANSI C不支持引用
2、ANSI C不支持函数重载
3、ANSI C多了两个整型(long long、unsigned long long),不过最新的C++编译器已经支持这两种整型
4、ANSI C不支持C++中的一个变量初始化方式,例如:int a(8);
5、ANSI C声明结构时必须使用struct关键字,而标准C++不需要
6、ANSI C标准库中的一些头文件,在标准C++中有了新的名称,例如ctime、cstring、climits、cfloat、cctype,有些文件不仅是名称上的变化
7、ANSI C不支持名称空间
8、ANSI C不包含bool类型,以及true和false关键字
9、声明函数时,参数为空的含义不同。在ANSI C中表示接受任意个数的参数,而在标准C++中表示不接受参数
10、ANSI C不支持内联函数
11、ASNI C不支持默认参数
12、ANSI C不支持可用于全局变量的作用域解析操作符(::)
13、使用const定义的全局常量在ANSI C中具有外部链接性,在标准C++中具有内部链接性,所以在标准C++中声明外部链接性的全局常量必须使用extern,例如:extern const int a = 10;

GNU C比ANSI C扩展的地方
1.允许零长度数组
GNU C允许零长度数组,在定义变长对象的头结构时,这个特性非常有用。

[cpp] view plaincopyprint?


  • struct var_data  
  • {  
  •       int len;  
  •       char data[0];  
  • };  



char data[0]仅仅意味着程序中通过var_data的结构体实例的data[index]成员可以访问len之后的第index个地址,并没有为data[0]分配内存。
假设struct var_data的数据域保存在struct var_data紧接着的内存区域,通过如下代码可以遍历这些数据:

[cpp] view plaincopyprint?


  • struct var_data s;  
  • ...  
  • for (i=0;i<s.len;i++)  
  • {  
  •     printf("%02x",s.data);  
  • }  



2、case范围
GNU C 支持case x...y 这样的语法,区间[x,y]的数都会满足这个case的条件,记得数据结构试验时,有的同学为了做菜单使用了近100个case,还好我做的是GUI的

[cpp] view plaincopyprint?


  • switch(c)  
  • {  
  •       case
    '0'...'9': c-='0';  
  •       break;  
  •       case
    'a'...'f': c-='a'-10;  
  •       break;  
  •       case
    'A'...'F': c-='A'-10;  
  •       break;  
  • }  



这个case的特点大家都看得出来,比标准C少敲了多少case啊
3、语句表达式
GNU C把包含在括号里的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方。我们可以在语句表达式中使用原本只能在复合语句中使用的循环变量、局部变量等,例如

[cpp] view plaincopyprint?


  • #define min_t(type,x,y) /
  • ({type __x=(x); type __y=(y);__x<__y?__x:__y})  
  • int ia,ib,mini;  
  • mini=min_t(int,ia,ib);  



这样,因为重新定义了__x和__y这两个局部变量,所以上述方法定义的宏将不会有副作用。在标准C中,对应的宏通常会有副作用:
#define min(x,y) ((x)<(y)?(x)y))
而代码min(++ia,++ib)将会被展开为
((++ia)<(++ib)?(++ia)++ib)) 传入宏的参数会被增加两次。
这个在 嵌入式程序员应知道的0x10个基本问题 里有讲过。
4、typeof关键字
typeof(x)语句可以获得x的类型,因此,我们可以借助typeof重新定义第3条提到的min_t这个宏

[cpp] view plaincopyprint?


  • #define min(x,y) /
  • ({ /  
  •       const typeof(x) _x=(x);/  
  •       const typeof(y) _y=(y);/  
  •       (void) (&_x==&_y);/  
  •        _x<_y ? _x: _y ; })  



我们不需要像第三条时那样传一个type进去,因为通过typeof(x)可以得到type。
代码 (void) (&_x==&_y);的作用是检查_x和_y的类型是否一致。
继承事业,薪火相传
返回列表