目录
跟涛哥一起学嵌入式:https://zhuanlan.zhihu.com/wanglitao
C 语言标准
- 定义各种关键字、数据类型
- 定义各种运算规则
- 各种运算符的优先级和结合性
- 数据类型转换
- 变量的作用域
- 函数原型
- 函数嵌套层数
- 函数参数个数限制
- 标准库函数
K&R C
K&R C 一般也称为传统 C。
ANSI C
ANSI C 是 ANSI(美国国家标准协会)在 K&R C 的基础上,统一了各大编译器厂商的不同标准,并对 C 语言语法和特性做了一些扩展,而发布的一个标准。
- 增加 signed、volatile、const 关键字
- 增加 void* 数据类型
- 增加预处理器命令
- 增加宽字符、宽字符串
- 定义了 C 标准库
- ……
C99
C99 标准是 ANSI 1999 年在 C89 标准的基础上新发布的一个标准,该标准对 ANSI C 标准做了一些扩充,比如新增一些关键字,支持新的数据类型:
- 布尔型:_Bool
- 复数:_Complex
- 虚数:_Imaginary
- 内联:inline
- 指针修饰符:restrict
- 支持long long、long double数据类型
- 支持变长数组
- 允许对结构体特定成员赋值
- 支持16进制浮点数、float _Complex等数据类型
- ……
除此之外,C99 标准也借鉴其它语言的一些优点,对语法和函数做了一系列改进,大大方便了程序员开发程序,比如:
- 变量声明可以放代码块的任何地方。ANSI C 规定变量的声明要全部写在函数语句的最前面,否则就会报编译错误。现在不需要这样写了,哪里需要使用变量,在哪里直接声明使用即可;
- 源程序每行最大支持4095个字节。这个貌似足够用了,没有什么程序能复杂到一行程序有4KB个字符;
- 支持//单行注释。ANSI C使用/**/没有C++的//注释方便,所以 C99 新标准借鉴过来了,也开始支持这种注释方式;
- 标准库新增了一些头文件:如 stdbool.h、complex.h、stdarg.h、fenv.h 等。大家在 C 语言中经常返回的 true、false,其实这也是 C++ 里面定义的 bool 类型。那为什么我们经常这样写,而编器编译程序时没有报错呢,这是因为早期大家编程使用的都是 VC++6.0 系列,是 C++ 编译器。还有一种可能就是有些 IDE 对这个数据类型的数据做了封装。
C11
C11 标准是2011年发布的最新 C 语言标准,修改了 C 语言标准的一些 Bug、新增了一些特性:
- 增加 _Noreturn,声明函数无返回值;
- 增加_Generic:支持泛型编程;
- 修改了标准库函数的一些 Bug:如 gets( )函数被 gets_s() 函数代替;
- 新增文件锁功能;
- 支持多线程;
- ……
编译器对 C 标准的扩展
Keil for C51
Keil for C51 或其他 IDE 里的 C 编译器会对 C 语言标准作很多扩展。比如增加各种关键字:
- data:RAM 的低128B空间,单周期直接寻址;
- code:表示程序存储区;
- bit:位变量,常用来定义单片机的 P0~P3 管脚;
- sbit:特殊功能位变量;
- sfr:特殊功能寄存器;
- reentrant:重入函数声明。
GCC
GCC 编译器,也对 C 标准做了很多扩展:
- 零长度数组
- 语句表达式
- 内建函数
- attribute特殊属性声明
- 标号元素
- case 范围
- ...