您的位置:首页 > 编程语言 > C语言/C++

小译c99标准 了解下c语言的生前身后事~

2009-07-30 20:20 363 查看
这段时间论坛上新闻里c0x的讨论不断,可是貌似ms的编译器连c99都没有支持完全。也罢,为了将来转战GCC打基础,小研读下c99.

ansi和iso标准委员会在1999年发布了c99标准,其中包括一些最新的改变。新的关键字,库函数和宏都成为推动C发展的动力。实际上,很多新特性已经不怎么兼容之前的版本,本文就旨在让你对新标准有一个大体的鸟瞰。

有趣的新特性,下面是开发者最关注也最应该关注的一些特点:

A:增长了的标识符长度限制。

当新定义一个变量或其他标识符或宏时,可以使用最多达63个字符。而外部标识符的长度则增长为31个字符。源代码中一行的字符数也变成了4095个。以上这些值在c89中依次为31,6和509个。

比较小的外部标识符长度便导致了很多ansi函数拥有这样的名字:strcpy,strstr,strchr等(原来如此!)

B:C++风格的注释。“//”可以注释一行了,和在C++里一样。。。原来在c99里才让C可以这样。。。

C:宏函数可以传入用(...)标识的可变参数列表。这些参数都存在一个额外的__VA_ARGS_里。这个貌似没试过,哪天用Mingw试下。

D:内联函数。C语言现在支持内敛函数了。怎么C才支持。。。

E:限制型指针。C语言现在支持restrict关键字,可以用此关键字来定义限制型指针,告诉编译器不允许这个指针有一个指向相同对象的别名指针,因为在某些处理以上指针的情况下它会被编译器优化掉。

F:_BOOL宏:C语言有了只有两个值的_BOOL类型,True定义为

#define true (_BOOL)1

false定义为

#define false (_BOOL)0

G:变量的所有声明可以出现在代码块的任何地方;不一定非要在一开始了。(原来这个也是在c99中出现的)。

H:可变长度的数组。C语言拥有了可以在运行时改变长度的数组。(这个应该是最大的变化,遥想当年刚写C++就被迫学vector的时候。。。)

I:在循环体中可以定义局部变量,比如for中。

J:struct的具名初始化。这个有点新鲜。他讲得麻烦。看这个例子就明白了:

struct{ float x, y, z; } s = { .y = 1.0, .x = 3.5, .z = 12.8 };

。。。呵呵 主要是精简了很多

K:新的long long类型。现在有了个新类型long long,用来表示至少64个二进制位的有符号整型值,有 了个新的后缀“ll”或“LL”来表示立即数(数字常量)。

L:每个函数都必须返回值。也就是说取消了以往c89中的默认返回int。

M:结构体的最后一个成员可以是不完全的数组类型,这是为了支持已经在很多编译器上都支持的"struct hack" 。(说得比较麻烦,其实就是可以在最后加上一个大小为0的数组元素,用的时候灵活分配空间,大家早就在用了,这样以后就可以直接不写大小了)。

N:新增了_Complex 和 _Imaginary数值类型,可以让程序员在程序中进行更多数学角度的排序。

O:一个定义或声明里可以容纳多个类型限制符。也就是说:

const const int x; 和 const int x; 是完全一样的。。。

。。。

还有很多但是就不那么重要了。

下面看下各编译器的支持情况:

MS:基本不支持,而且好像人家也不打算在将来的C编译器中加上对c99的支持。。。

BORLAND:基本不支持(不过现在好像支持了)。

GNU:是离标准最接近的编译器,基本全部支持,看来GNU委员会和ISO关系不错。。。这么给面子。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: