C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。C语言是世界上最流行、使用最广泛的高级程序设计语言之一。
C语言的特点:(为什么嵌入式开发选择C语言?)
1)具有出色的可移植性,能够在多种不同体系的软硬件平台上运行。UNIX、MS-DOS、Microsoft Windows及Linux等操作系统都的内核都采用C语言
(可移植性:一个平台的代码到另一个平台上仍可以运行。可移植性好:移植到另一个平台上要修改的程序越少越好)
2)具有简介紧凑,使用灵活的语法机制,直接访问硬件。虽然说汇编也能直接访问硬件,但是汇编是低级语言,不能实现复杂的功能。汇编语言一般用于对比较简单的硬件做初始化。
3)具有很高的运行效率。相对于运行速率更高的汇编语言,c语言是高级语言,能实现比较复杂的功能。相对于其他高级语言,c语言属于高级语言中的低级语言,能直接访问硬件,所以它的运行效率可达汇编语言的80%,而其他高级语言只能达到c语言的80%。并且c语言编译之后产生机器语言,直接被硬件识别,不需要像JAVA那样在运行时程序翻译成机器语言。
C语言作为一种开发语言,在嵌入式开发中的作用是:应用工程师,驱动工 程师,BSP,kernel工程师
C语言是面向过程的语言,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
C语言标准:(选择编译器时要知道其支持的标准)
1)K&RC:1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称作“K&R C”。K&R C主要介绍了以下特色:
· 结构(struct)类型
· 长整数(long int)类型
· 无符号整数(unsigned int)类型
· 把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。
2) C89(ANSIC)
1983年,美国国家标准协会组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作"ANSI C",或有时称为"C89"(为了区别C99)。 在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会采纳为ISO/IEC 9899:1990。这个版本有时候称为C90或者ISO C。因此,C89和C90通常指同一种语言。 传统C语言到ANSI/ISO标准C语言的改进包括:
· 增加了真正的标准库
· 新的预处理命令与特性
· 函数原型允许在函数申明中指定参数类型
· 一些新的关键字,包括 const、volatile 与 signed 宽字符、宽字符串与字节多字符
· 对约定规则、声明和类型检查的许多小改动与澄清
3)C99
· 2000年3月,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 C99新增了一些特性,如:
· 支持不定长的数组,即数组长度可以在运行时决定。
· 变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效。
· 初始化结构的时候允许对特定的元素赋值。
· 允许编译器化简非常数的表达式。
· 取消了函数返回类型默认为 int 的规定。
目前最多的编译器支持此标准
4)C11
在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准。这个标准通常即C11,它是C程序语言的最新标准。C11制定了许多可选的特性,使得更容易遵守核心的语言标准。新的标准修提高了对C++的兼容性,并将新的特性增加到C语言中。新功能包括支持多线程, 基于ISO/IEC TR 19769:2004规范下支持Unicode,提供更多用于查询浮点数类型特性的宏定义和静态声明功能。这些新特性包括:
● 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及<stdalign.h>头文件。
● _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。
● _Generic 关键字。
● 多线程(Multithreading)支持,包括:_Thread_local存储类型标识符,<threads.h>;头文件,里面包含了线程的创建和管理函数。
● 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.
● 删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。
● 增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。 ● 增加了更多浮点处理宏。
● 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。
● 静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
● 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
● 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。
● _Atomic类型修饰符和<stdatomic.h>;头文件。
Ios和windows的部分软件支持此标准。
GCC支持的标准
GCC支持C90, 不完全支持C99。在不指定C标准的情况下,GCC默认使用GNU C。用一个式子表示GNU C:
GNU C = C90 + GNU Extensions = C90 + (some features in C99 + some features in C11)
GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。