C 语言标准及编译器介绍

简介: 今天给大家介绍一下C语言标准及其由来

1. 什么是 C 语言标准


C 语言程序通过编译器,参考不同架构的指令集,编译生成对应的二进制指令,才能在不同的处理器上运行。


在早期,各大编译器厂商在开发各自编译器时,各自开发,各自维护,比较混乱,造成一个局面:程序员写的程序,在一个编译器上可以通过,在另一个编译器上编译可能就通不过。


为了统一标准,美国国家标准协会(American National Stardards Institude, ANSI)联合国际化标准组织(International Organization for Standardization, ISO)召集各个编译器厂商和各种技术团体一起开会,开始推行C语言的标准化行动。


1989 年,发布了第一版C语言标准,并在第二年做了一些改进,因为在1989年发布的,所以一般称其为C89或者C90标准,或者叫做ANSI C 标准。


2. C 语言标准内容


C 语言标准,总体归纳起来,主要就是C语言编程的一些语法惯例、约定规则,如:


  • 定义了各种关键字、数据类型;


  • 定义各种运算规则、各种运算符的优先级和结合性;


  • 数据类型转换;


  • 变量的作用域;


  • 函数原型、函数嵌套层数、函数参数个数限制;


  • 标准库函数接口;


C 语言标准发布后,大家都按照这个标准开展工作:程序员开发程序时,按照这种标准规定的语法规则编写程序;编译器厂商开发编译器工具时,也按照这种标准去解析。不同的编译器厂商支持统一的C语言标准,我们编写同一个程序使用不同的编译器都可以正常编译和运行。


3. C 语言标准发展


C 语言的标准并不是永远不变的,和其他标准一样,也是在不断发展的,C 语言标准经历了下面四个阶段。


  • K&R C;


  • ANSI C;


  • C99;


  • C11;


K&R C


K&R C 一般也成为传统C。在C语言标准没有统一之前,C 语言的作者 Dennis M.Ritchie 和 Brian W.Kernighan合作写了一本书《C程序设计语言》。


早期程序员编程,这边书可以说绝对是权威的。这本书很薄,内容精炼,主要介绍了C语言的基本语法,后来第二版问世,做了一些修改。第二版可以看作ANSI标准的雏形,但早期的C语言还是很简单的,如还没有定义标准库函数,没有预处理命令等。


ANSI C


ANSI C 是ANSI 在K&R C 的基础上,【统一了各大编译器厂商的不同的标准,并对C语言的语法和特性做了一些扩展】,在1989年发布的一个标准。这个标准一般也叫做C89/C90标准,也是目前各种编译器默认支持的C语言标准。ANSI C 标准主要新增了以下特性。


  • 增加了signed、volatile、const关键字


  • 增加了 void* 数据类型


  • 增加了预处理器命令


  • 增加了宽字符、宽字符串


  • 定义了C标准库


  • ......


C99 标准


C99 标准 是ANSI 在1999年基于C89标准发布的一个新标准。该标准对ANSI C 标准做了一些扩充,如新增了一些关键字,支持新的数据类型等。


  • 布尔型:_Bool


  • 复数:_Complex


  • 虚数:_Imaginary


  • 内联:inline


  • 指针修饰符:restrict


  • 支持 long long、long double 数据类型


  • 支持变长数组


  • 允许对结构体特定成员赋值


  • 支持十六进制浮点数、float _Complex等数据类型


  • ......


C99 标准也会借鉴其他标准的优点,对自身的语法和标准做一系列修改:


  • 变量声明可以放在代码的任意位置。ANSI C 标准规定了变量的声明要全部写在函数语句的最前面,否则会编译报错。


  • 源程序每行最大支持4095个字节。


  • 支持 // 单行注释。早期的ANSI C标准使用 /**/ 注释,从C99标准开始也支持这种注释方式。


  • 标准库新增了一些头文件,如stdbool.h、complex.h、stdarg.h、fenv.h等。


C11 标准


C11 标准 是ANSI 在2011 年发布的最C语言标准,C11 标准修改了 C 语言标准的一些bug,增加了一些新特性。


  • 增加_Noreturn,声明函数无返回值。


  • 增加_Generic,支持泛型编程。


  • 修改了标准库函数的一些bug,比如gets()函数被gets_s()函数代替


  • 新增文件锁功能。


  • ......

C17 标准 C17(也被称为为 C18)是于2018年6月发布的 ISO/IEC 9899:2018 的非正式名称,也是目前(截止到2020年6月)为止最新的 C语言编程标准,被用来替代 C11 标准。


C17 没有引入新的语言特性,只对 C11 进行了补充和修正。


4. 编译器对 C 语言的支持


标准是一回事儿,编译器支不支持是另外一回事儿。不同的编译器对C语言标准支持不一样。有的编译器只支持 ANSI C 标准,这是目前默认的C语言标准。有的编译器可以支持C99,或者支持C99 标准的部分特性。


对于 C11 和 C17 ,大多数编译器可能暂时还不支持。目前对于C99标准支持最好的就是GNU C 编译器了,据说可以支持C99标准99%的新特性。


5. 编译器对 C语言标准的扩展


不同编译器,出于开发环境、硬件平台、性能优化需要,除了支持C 语言标准,还会自己做一些扩展。比如GCC 编译器就对C语言做了需要扩展:


  • 零长度数组;


  • 语句表达式;


  • 内建函数;


  • __attribute__ 特殊属性声明。


  • 标号元素


  • case 范围


  • ......
相关文章
|
1月前
|
自然语言处理 中间件 编译器
C语言的编译器和中间件开发
C语言的编译器和中间件开发
|
1月前
|
设计模式 中间件 编译器
C语言编译器
C语言编译器
|
1月前
|
存储 编译器 程序员
C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学
C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学
|
6月前
|
编译器 Linux C语言
c语言的编译器vs2019的安装及简单实用
c语言的编译器vs2019的安装及简单实用
93 0
|
3月前
|
存储 编译器 C语言
【C语言必知必会 | 第二篇】编译器的安装与使用
【C语言必知必会 | 第二篇】编译器的安装与使用
25 0
|
4月前
|
自然语言处理 Java 编译器
C语言是什么 C语言历史 编译器怎么运行C语言的代码 怎么学好C语言
C语言是什么 C语言历史 编译器怎么运行C语言的代码 怎么学好C语言
|
4月前
|
编译器 C语言 Windows
windows MinGW C语言编译器安装及环境变量配置教程
MinGW被称为Windows版的GCC,安装包下载地址:提示:该安装包下载完之后,相当于安装好了MinGW,之后即可配置环境变量!所以,可以先新建好一个专门用来存放MinGW安装包的文件夹。
76 2
|
10月前
|
监控 编译器 C语言
C语言关于解决vs编译器scanf等函数输入不安全
在VS编译器中,scanf等函数并不会对你输入值进行长度监控,因此在某些层面上就很容易造成内存的溢出。
149 0
|
11月前
|
自然语言处理 IDE 编译器
【C语言】--编译及编译器
【C语言】--编译及编译器
97 0
|
编译器 Linux 开发工具
C语言编译器的选择和安装
C语言编译器的选择和安装
637 0