读书笔记:跟涛哥一起学嵌入式_note_2

目录

C 语言标准

K&R C

ANSI C

C99

C11

编译器对 C 标准的扩展

Keil for C51

GCC


跟涛哥一起学嵌入式: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 范围
  • ...

 

你可能感兴趣的:(#,嵌入式软件笔记)