首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于 C 语言标准的那些事儿

很多学习 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 语言标准,相信很多小伙伴儿会感觉头大,不知道如何选择和学习。其实不必为版本纠结,精力应该放在学习编程思想和提升项目开发能力上面。版本不同只不过代码语法形式略微不同,心中有数,简单调整一下即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230227A07V8V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券