====== C语言标准 ====== ===== C的标准化过程 ===== C语言自诞生到现在,期间经历了多次标准化过程,主要分成以下几个阶段: ==== Traditional C ==== 此时的C语言还没有标准化,来自“C Programming Language, First Edition, by Brian W. Kernighan, Dennis M. Ritchie. Prentice Hall PTR 1978”的C描述可算作“正式”的标准,所以此时的C也称为“K&R”C。 期间C语言一直不断的发生细微的变化,各编译器厂商也有自己的扩展,这个过程一直持续到20世纪80年代末。 ==== C89 ==== 考虑到标准化的重要,ANSI(American National Standards Institute)制定了第一个C标准,在1989年被正式采用(American National Standard X3.159-1989),故称为C89,也称为ANSI C。 该标准随后被ISO采纳,成为国际标准(ISO/IEC 9899:1990)。 C89的主要改动: * 定义了C标准库; * 新的预处理命令和特性; * 函数原型(prototype); * 新关键字:const、volatile、signed; * 宽字符、宽字符串和多字节字符; * 转化规则、声明(declaration)、类型检查的改变。 ==== C95 ==== 这是对C89的一个修订和扩充,称为“C89 with Amendment 1”或C95,严格说来并不是一个真正的标准。 C95的主要改动: * 3个新标准头文件:iso646.h、wctype.h、wchar.h; * 一些新的标记(token)和宏(macro); * 一些新的printf/scanf系列函数的格式符; * 增加了大量的宽字符和多字节字符函数、常数和类型。 ==== C99 ==== 这是目前最新的标准,由ISO制定于1999年(ISO/IEC 9899:1999),故称为C99。 C99的主要改动: * 复数(complex); * 整数(integer)类型扩展; * 变长数组; * Boolean类型; * 非英语字符集的更好支持; * 浮点类型的更好支持; * 提供全部类型的数学函数; * C++风格注释(/ /)。 ===== C标准文档 ===== ==== C99 ==== 为了方便,在本地存放了一份标准拷贝。这是一个pdf文件,请点击[[ftp://gwduan.com/pub/wiki/c/standards/c99.pdf|c99.pdf]]下载。 ==== C89 ==== C99已经替代C89成为标准,所以C89文档已经很难找了。 下面是书籍“C Programming Language, Second Edition, by Brian W. Kernighan, Dennis M. Ritchie. Prentice Hall PTR (April 1, 1988), 0131103628.”附录A的一份拷贝,在此作为C89标准以供需要时查阅。 同时也提供中文版本,内容来自该书对应的中译版“《C程序设计语言》,徐宝文等译,机械工业出版社出版,ISBN 7111075897”。 文档存放在[[http://gwduan.com/web|旧版站点]]里,就不再转化到wiki来了(仅供个人参考使用,建议以英文版为主): [[http://gwduan.com/web/computer/languages/c/c89_en.html|英文版]] [[http://gwduan.com/web/computer/languages/c/c89_ch.html|中文版]] 同时附一份[[http://gwduan.com/web/computer/languages/c/punctuation.html|标点符号中英对照表]],供参考。 ===== C标准的选择 ===== 选择标准依赖于编译器的支持和对可移植性的要求。 C99是当前的标准,但它仍未得到广泛支持,虽然标准发布已经多年。C99对C89(C95)的改动非常大,如果编写C99的代码,那么可移植性必然受到限制。此外,个人认为C99的一些新特性在大多数程序设计中并不是必须的。 C89(包括C95)是目前使用最广泛的,并得到所有主流编译器的支持。 Traditional C现在只会在一些非常老的代码中才能见到了,除非你在维护旧代码,否则不应该再使用它。 所以,个人觉得当前还是以C89(包括C95)标准为主。 {{tag>C语言}}