C99 的语言新特性

转载 2006年05月18日 23:50:00


 版权所有:云风   


云风吐血整理了下面这个 :) 可能还有极少漏掉的新特性.   
不过那一般是用处不大的东西   

1. 对编译器限制增加了,比如源程序每行要求至少支持到 4095 字节   
变量名函数名什么的要求支持到 63 字节 ( extern 的要求支持到 31)   
2. 预处理增强了. 例如, 1.宏支持类似 ... 的东西   
#define Macro(...) __VA_ARGS__   
2. 使用宏的时候,参数如果不写. 而宏里用 #,## 这样的东西,   
会扩展成空串. (以前会出错的)   
3. 支持 // 行注释   
4~xx. 还有些我不太关心的扩展 ;)   
3. 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool   
restrict 含义比较复杂, 不太能简单解释清楚. 好在大家应该   
都有耳闻是什么东西, 后面几个 _开头的类型关键字早就应该支持了 ;)   
因为防止以有的代码出问题, 所以只好 _ 开头了   
支持 long long, long double _Complex, float _Complex 这样的类型 :)   
4. 支持 <: :> <% %> %: %:%:, 等等奇怪的符号替代, D&E 里好象提过这个   
5. 支持了不定长的数组. 数组的长度就可以用变量了 :) 这个是我刚刚从   
basic 转到 C 时最想要的东西 :) 声明类型的时候呢,就用 int a[*]   
这样的写法. 不过考虑到效率和实现, 这玩意并不是一个新类型.   
所以就不能用在全局里, 或者 struct union 里面, 说白了, 就是帮你调用   
_alloca. 当然, 如果你用了这样的东西, goto 语句就受限制了.   
不能跳到所在的语句段里了.   
6. 变量声明可以放在任何地方, 而不必都放在语句段的开头.   
而 for 语句现在提倡这么写 for(int i=0;i<100;++i) 就是说, int i 
的声明放在里面, i 只在 for 里面有效. 
7. 当一个类似结构的东西需要临时构造的时候, 可以用 (type_name) 
{xx,xx,xx} 这有点像 C++ 的构造函数 嘿嘿 
8. 初始化结构的时候现在可以这样写: 
struct {int a[3], b;} hehe[] = { [0].a = {1}, [1].a = 2 }; 

struct {int a, b, c, d;} hehe = { .a = 1, .c = 3, 4, .b = 5} // 
3,4 是对 .c,.d 赋值的 

这个感觉超强啊 ^^ 我一直想要的东西, 为什么 C++ 没有呢 ;( 

9. 字符串里面, u 支持 unicode 的字符 :) 
10. 好象还支持什么 16 进制的浮点数的描述, 不过我很奇怪为什么不支持 2 
进制整数的描述 
11.因为现在支持 long long 了(规定至少是 64bit) , 所以 printf scanf 里就多出支持一个 ll / 
LL (VC6 里用的 I64) 
12. 浮点数的内部数据描述支持个什么新标准来着, 这个可以用 #pragma 什么的去指定 
13. 除了已经有的 __line__ __file__ 以外, 又支持了一个 __func__ 
,可以得到当前的函数名, 这个 gcc 好象早就有了 
14. 对于非常数的表达式,也允许编译器做化简 
15. 对于 / % 负数上的定义, 总算改成了我最希望的形式 
比如原来 -22 / 7 = -3, -22 % 7 = -1 
现在 -22 / 7 = -4, -22 % 7 = 6 
为了这个问题, 我以前老自己定义一个 DIV 和 MOD 宏或 inline 函数 ;( 
16. 那个不写函数返回类型, 默认就是 int 的规定取消了. 
再这么写就不通过了 
17. 以前我偏爱 C 的时候, struct 定义的最后一个数组的长度喜欢写 [0], 在 
C++ 里是通不过的. C99 这次把这种做法统一规定写 [] (既不写长度描述) 
18. 为了方便宏或者代码生成器, 如果你写 const const int i; 是不出错的, 
当成 const int i; 处理 
19. 增加和修改了一些标准头文件, 比如定义 bool 的 <stdbool.h>   
定义一些标准长度的 int 的 <inttypes.h>   
定义复数的 <complex.h>   
定义宽字符的 <wctype.h>   
有点泛型味道的数学函数 <tgmath.h>   
跟浮点数有关的 <fenv.h>   

<stdarg.h> 里多了一个 va_copy 可以复制 ... 的参数   
<time.h> 里多了个 struct tmx 对 struct tm 做了扩展   

输入输入对宽字符还有长整数什么的做了相应的支持   


欢迎补充写漏的东西 :)     

C语言的角落(二)——你不一定知道的C语言特性

之前写过一篇C的语言的角落,介绍了一些C中的一些非常用特性(http://blog.csdn.net/yang_yulei/article/details/34557625),最近又整理了一些边角的知...
  • yang_yulei
  • yang_yulei
  • 2015年06月03日 00:04
  • 2828

C99标准新特性的说明

C99标准新特性的说明   一、说明 ====== 这里的讨论的是C语言的国际标准,即国际标准化组织ISO,制定的C语言标准。历史上ISO制定过4个版本的C语言标准...
  • zhangzl4321
  • zhangzl4321
  • 2017年06月19日 20:37
  • 247

C99 标准新特性

感谢作者的辛苦付出。 ----------------------------------------------- 1、增加restrict指针 C99中增加了公适用于指针的restrict类型修饰...
  • maxzero
  • maxzero
  • 2017年02月09日 11:41
  • 550

变长数组-C99新特性

C99允许我们在任何地方定义变量,并且支持不定长数组的定义,即,我们可以使用变量来定义我们的数组。这就使得我们可以在程序运行过程中根据实际需要来定义数组长度。 摘自http://hi.baidu.co...
  • IT_PCode
  • IT_PCode
  • 2013年12月11日 11:51
  • 1829

C99灵活数组-incompleted array

最近看ucc源码,在类型子系统中有一个类型RecordType(记录结构,包括union和struct),这个结构中有一个hasFlexArra域,文档指出是用于标识是否含有灵活数组 灵活数组是添加...
  • zhccl
  • zhccl
  • 2012年08月07日 00:27
  • 2633

各编译器对C99的支持

在审一本C语言教材时,涉及到各编译器对C99的支持,于是Google了一番。 这篇文章是总结得比较全面的。不过其中对Borland编译器的说明已经过时。C++BuilderX已经全面支持C99了。用 ...
  • turingbook
  • turingbook
  • 2006年06月27日 17:10
  • 25415

c语言之标准(K&RC 、c89、c99、c11)

K&R C  1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称...
  • qq_31029351
  • qq_31029351
  • 2016年11月22日 20:04
  • 3614

C99 c语言特性 数组可以这样初使化

数组 我们可以指定数组的元素来进行初始化 C99 c语言特性              我在线用c++ 14 可以编译  char *err_strings[] = {    ...
  • kaizi318
  • kaizi318
  • 2015年06月19日 17:37
  • 3859

C语言中变量定义的位置(C89和C99的区别)

C语言中变量定义的位置(C89和C99的区别)          在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了“哪里使用哪里定义”的这种做法,所以当用C语言进行编程的...
  • dan15188387481
  • dan15188387481
  • 2015年11月06日 21:22
  • 3399

C99标准之前没有bool类型(C99提供)

我们知道在C++里有专门的bool类型,用来表示真或假。但是在C语言里没有这样的类型。 表达式的值0为假,非0为真。所以条件判断语句( if(…)、while(…) )非常灵活,甚至一个指针类型都可以...
  • rl529014
  • rl529014
  • 2016年04月19日 12:33
  • 1770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C99 的语言新特性
举报原因:
原因补充:

(最多只允许输入30个字)