很多学习 C 语言的小伙伴儿经常问挨踢魔君一个问题,为啥自己写的同一份代码在不同的开发环境下会有不同的反应?有的能正常编译和运行,有的却编译报错或报警告。例如,同样的代码用 gcc 能正常编译通过,但用 VS 就报错,甚至用较旧版本的 gcc 也会报错。
这个问题的根本原因是不同版本的编译器支持的 C 语言标准版本可能不同,或者对同一个版本的 C 语言标准的支持程度可能不同。新版本的 C 语言标准通常会增加一些新的语言特性,并且会向下兼容,但也可能会废弃或改进旧版本中的某些语言特性。
如果你在代码中使用了新版本 C 语言标准增加的那些语言特性,而你用的编译器支持的标准版本较旧,或者支持新版本但支持程度不够,不认识这些代码,自然就会编译报错。一般来说,编译器的版本越新,它所支持的 C 语言标准版本也会越新。所以要想体验更新版本的 C 语言标准,就要升级自己用的编译器了。
C 语言标准不仅对我们程序员很重要,对 C 语言自身发展也是非常关键的。俗话说无规矩不成方圆,如果没有完善的统一标准,就肯定不会有今天的 C 语言。接下来我们按发布时间顺序一起看看 C 语言标准到底有哪些版本。
K&R C
C 语言诞生后的十多年期间都没有制定标准,当时所有人都是按照史上第一本 C 语言专业书——《The C Programming Language》来使用 C 语言。这本书是由著名计算机科学家布莱恩·克尼汉(Brian Kernighan)和 C 语言之父丹尼斯·里奇(Dennis Ritchie)一起编写的,被誉为“C 语言圣经”。当时所有编译器都是按照这本书的解释来做的,是事实上的编译器标准,所以我们形象的称之为“K&R C”或“经典 C”,其中 K 和 R 是两位作者姓氏的首字母。K&R C 虽然不是一个正式的编程语言标准,但被实际使用了很多年,它与后来标准化的 C 语言存在比较大的差异。
C 语言圣经C89
1982 年,很多有识之士和美国国家标准协会(American National Standards Institute,ANSI)为了使 C 语言能够健康地发展下去,决定成立 C 语言标准委员会,建立 C 语言的统一标准。直到 1989 年,ANSI 才发布了第一个完整的 C 语言标准——ANSI X3.159-1989,简称“C89”,不过人们也习惯称其为“ANSI C”。
C 语言标准委员会由硬件厂商、编译器及其他软件工具生产商、软件设计师、顾问、学术界人士、C 语言作者和应用程序员组成。
C89 的主要改动如下:
定义了 C 标准库;
新的预处理命令和特性;
函数原型(prototype);
新关键字:const、volatile、signed;
宽字符、宽字符串和多字节字符;
转化规则、声明(declaration)、类型检查的改变。
C90
1990 年,C89 标准被国际标准化组织(International Standard Organization,ISO)一字不改地采纳,ISO 官方给予的名称为:ISO/IEC 9899:1990,通常被简称为“C90”,和 C89 基本一样。
C95
1995 年,ISO 对 C90 进行了一些修订和微小扩充,称为 C95。
C95 的主要改动如下:
3 个新标准头文件:iso646.h、wctype.h、wchar.h;
一些新的标记(token)和宏(macro);
一些新的 printf/scanf 系列函数的格式符;
增加了大量的宽字符和多字节字符函数、常数和类型。
C99
1999 年,在做了一些必要的修正和完善后,ISO 发布了新的 C 语言标准,命名为 ISO/IEC 9899:1999,简称“C99”。C99 在 C89 的基础上新增了很多语言特性。
C99 的主要改动如下:
复数(complex);
整数(integer)类型扩展;
变长数组;
Boolean 类型;
非英语字符集的更好支持;
浮点类型的更好支持;
提供全部类型的数学函数;
C++ 风格注释(//)。
C11
2011 年 12 月 8 日,ISO 正式发布了新的 C 语言标准,命名为 ISO/IEC 9899:2011,简称为“C11”。
C11 标准引入的新特性虽然没 C99 相对 C90 引入的那么多,但是都很有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持。
C17
2018 年 6 月,ISO 正式发布了新的 C 语言标准,命名为 ISO/IEC 9899:2018,简称为“C17”或“C18”。C17 并没有引入新的语言特性,只是对 C11 进行了一些补充和修正。
C2x
C 语言的下一个 ISO 标准,将于近期推出,感兴趣的小伙伴儿可以关注下。
虽然 ISO 在不断推出新的 C 语言标准,但编译器和开发者并没有完全跟上其步伐。在实际开发中,我们常用的还是 C89 和 C99 这两个版本,并且企业级开发也不会刻意追求新版本。
换个角度看,C 语言标准不断升级证明了 C 语言没有固步自封,而是在不断进步和创新,充满活力,欣欣向荣,这对所有开发者来说都是一件好事。
看到这么多不同版本的 C 语言标准,相信很多小伙伴儿会感觉头大,不知道如何选择和学习。其实不必为版本纠结,精力应该放在学习编程思想和提升项目开发能力上面。版本不同只不过代码语法形式略微不同,心中有数,简单调整一下即可。
领取专属 10元无门槛券
私享最新 技术干货