【嵌入式】C语言高级编程▁▁▁嵌入式C语言入门编程学习!
✍ 1、C 语言标准
什么是 C 语言标准呢?
我们所处的现实世界是一系列规范建立而成的。基于这些规范,我们的社会从而得以有序地运行。
例如我们在过马路时 遵守交通规则 就是指这个基本的标准 遇到红灯要停车 绿灯就可通过 黄灯亮起时 请稍作等待 当行人和司机都能够遵守这一规定时 整个交通系统就能运行得顺畅一些
电脑中的USB接口是一种标准化配置,在所有生产出来的USB产品均严格遵守USB协议这一通信标准之后,在各种电子设备之间实现了统一的兼容性与互联性。因此,在这种情况下我们的手机,U盘,USB摄像头,USB网卡等设备才可以实现互相插入拔出的操作功能。
2G/3G/4G 作为一种通信规范的存在意义重大;若不同厂商生产的调制解调器都遵循这一通信规范,则我们常用的各类品牌及其操作系统设备间才得以实现通话互动;通过微信平台相互发送信息也是完全可行的;彼此给予对方点赞行为则可以通过特定机制完成
同样,C 语言也有它自己的标准。
众所周知,在现代计算机系统中,C语言程序需要由编译器将其转换为二进制指令序列以实现功能。而在C语言初期推出时,在各大编译器厂商开始各自独立研发并自行维护自己的编译器之前
这个就会形成一个状况:由程序员编写的各种程序,在某个编程环境中能够被识别和处理,在另一个编程环境中则无法识别或处理。人们按照各自的习惯行事,并彼此之间互不相让的情形就如同古代中国春秋战国时期的情形:采用不同货币单位和度量衡系统并并存的状态下的人们使用不同文字系统同样复杂多变的状态一样由于缺乏统一的标准体系导致交流起来十分不便这样的局面持续下去也是难以找到解决办法的
随后美国国家标准协会ANSI应运而生,并与国际标准化组织ISO合作召集行业顶尖技术力量举行 informal 的交流会议。在这一过程中出现诸多分歧,在历经曲折商讨后于1989年成功达成共识并最终定稿并发布了C语言标准。自发布以来就广为人知,并被统称为ANSI C或简称为C standard。
✍ 2、C 标准内容
C标准英文文档详尽地阐述了丰富的知识体系,经过总结分析,主要涉及C语言编程的一些规范和准则,例如:
✪ 定义各种关键字、数据类型
✪ 定义各种运算规则
✪ 各种运算符的优先级和结合性
✪ 数据类型转换
✪ 变量的作用域
✪ 函数原型
✪ 函数嵌套层数
✪ 函数参数个数限制
✪ 标准库函数
随着C语言标准的发布与普及,在整个编程社区中广泛传播并应用。许多程序员在实际项目中遵循这一规范编写代码;同时软件工具制造商在构建解析与优化系统时也会采用这一规范进行代码分析与转换。目前多数软件工具制造商都支持这一通用规范以确保编写好的代码不论使用何种解析与优化系统都能得到正确的执行结果。
✍ 3、C 标准的发展历程
C标准并非一成不变,如同移动通信领域的发展历程,同样经历了从2代到5代的发展演变过程。它同样经历了以下四个发展阶段:
✪ K&R C
✪ ANSI C
✪ C99
✪ C11
☆ K &R C
传统上被称为K&R C的语言是一种经过广泛影响的编程范式。在C语言标准化尚未统一之前,Dennis Ritchie和Brian Kernighan合著的经典著作《C程序设计语言》横空出世,成为早期程序员编程的重要参考文献,被誉为绝对权威。该书简洁明了,系统介绍了C语言的基本使用方法,具有极强的学习价值和参考意义。随着版本更新,第二版《The C Programming Language》做了多项优化与改进工作:例如引入了无符号整数类型(unsigned int)、长整数类型(long int)以及结构体类型(struct);将运算符 =+/=- 替换为 +=/-=,以消除潜在的歧义性和潜在Bug;同时书中也暗示了后续ANSI标准文档的重要性,但早期的C语言体系相对基础,缺乏标准库函数定义及预处理指令等核心功能
☆ ANSI C
ANSI C 由 ANSI(美国国家标准协会)在 K&R C 的基础上统一了各版本编译器之间的不同规范,并在此框架上增加了对其语法结构和一些特性进行了扩展。这一发布出来的标准通常也被称为C89/C90标准,并且这也是多数编译器所采用的标准。ANSI 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等数据类型
……
此外
● 变量声明可以在代码块的任何位置进行放置。 在ANSI C中,默认情况下要求所有变量声明必须位于函数语句的第一行以避免编译错误。然而现在这种规定已经不再适用了,在需要使用变量的地方直接进行声明即可完成操作。
该程序每行最多容纳4KB的字符。看起来已经够用了,并没有任何一个正常的程序会将一行代码扩展到如此程度
ANSI C 采用/**/ 作为单行注释的方式 并未像 C++ 中那样方便 因此 C99 标准借鉴了这一做法 从而也采纳了这一注释方式
● 标准库新增了若干个头文件: 例如 stdbool.h、complex.h、stdarg.h 和 fenv.h 等等。大家在 C 语言中常用于返回的结果通常是 true 或 false。这也是一种由C++ 中所定义的一种类型。那么我们为何仍然使用这种方式?编译器不会报错?这归因于早期编程环境中普遍使用的是 VC++6.0 系列 是基于C++ 的编译器。此外,在某些集成开发环境中(IDE),这种数据类型会被封装处理。
☆ C11 新标准
C11 标准是在2011年发布的新版本C语言标准。该标准对原有的C语言标准进行了修订并修正了一些已知的缺陷,并增添了许多新的功能模块以提高编程效率和扩展性。
● 增加 Noreturn,声明函数无返回值;
● 增加Generic:支持泛型编程;
● 修改了标准库函数的一些 Bug:如 gets( )函数被 gets_s() 函数代替;
● 新增文件锁功能;
● 支持多线程;
……
从 C11 标准的修改内容来看,也慢慢察觉到 C 语言未来的发展趋势:
C 语言正在吸收现代编程语言的优秀特性并逐步融入自身标准中。例如现代编程语言所拥有的多线程特性、字符串操作以及泛型编程技术等特色,在当前版本中也能见到端倪。
然而持续这样的发展路径是否能让C 语言依然保持着"简单即强大"的独特魅力?我们只能说这是一个值得期待的趋势。
不过就目前而言我们无需过分担忧这一问题因为根据现有数据大多数编译器仍无法理解和处理新的标准内容
✍ 4、编译器对 C 标准的支持
标准问题与编译器支持性问题本质上属于两个不同的议题。这一点必须明确。如同手机进化过程中的不同阶段,在不同时间段对通信标准的支持也会有所差异。早期版本的智能手机通常仅具备2G制式的支持;随后逐渐升级至3G网络覆盖能力;如今大多数新发布的智能手机都集成4G技术,并可兼容2G和3G网络。
正处在研发阶段的5G标准即将推出,并且已经提前进入全面推行阶段。据内部消息人士透露,“5G标准将在2019年内推出,并计划在2020年内投入商用”。然而目前没有任何手机设备能够实现对5G技术的通信支持——这与目前没有任何编程语言(如C++)能够支持C++ 11.0标准的情况相仿。
各种编译器在C标准的支持上也存在差异。有些编译器仅限于ANSI C标准这一传统体系,并非现代 enhancements. 有些编译器则能够扩展至C++标准,并可兼容C++部分特性. 以GNU Compiler Collection最为著名的是能够兼容最多C++特性的一流工具. 这种工具据说能够覆盖约95%的新增功能.
✍ 5、编译器对 C 标准的扩展
多种编译器在开发环境中选择不同的适应性策略,在硬件平台适配性和性能优化方面进行特定化配置,并非仅仅局限于C标准的支持;也会进行一些特定性的增强或调整。
在51单片机上使用C语言编写程序时,请常采用Keil C51集成开发环境来完成开发工作。您会发现,在大多数IDE中运行的C编译器都会对C语言标准作出诸多扩展。例如,在编译过程中可能会引入一些额外的关键字:
▶ data:RAM 的低128B空间,单周期直接寻址;
▶ code:表示程序存储区;
▶ bit:位变量,常用来定义单片机的 P0~P3 管脚;
▶ sbit:特殊功能位变量;
▶ sfr:特殊功能寄存器;
▶ reentrant:重入函数声明。
当在程序设计中采用这些关键指令时
同样的道理,GCC 编译器,也对 C 标准做了很多扩展:
▶ 零长度数组
▶ 语句表达式
▶ 内建函数
▶ __attribute__特殊属性声明
▶ 标号元素
▶ case 范围
例如实现零长度数组的支持。新增功能模块,“C 标准目前是不被现有主流编译器所支持”的特性也尚未引入到其他地方。假设您在代码中定义了一个空数组:

编译如下:

仅限于 GCC 的开发环境能确保项目顺利通过编译过程。若采用 VC++ 6.0进行构建,则可能会出现构建失败的情况。需要注意的是,在这种情况下,默认情况下微软的 C++ 开发工具不具备该功能特性。
✍ 6、Linux内核C语言示例
人们通常会在学习一些 GNU 开源软件或者深入研究 Linux 内核及其驱动代码的过程中注意到,在Linux内 kernel 源码中有大量用C语言编写的代码呈现出一种奇特且难以理解的特点. . . .这些代码往往让许多人感到困惑.
宏定义

内核中实现打印功能的宏定义

结构体初始化

这些其实是另一种形式的C编程语言,并非严格的标准C语法体系,在Linux内核开发中使用的是基于GNU C编译器扩展而产生的额外语法规则。这类规则往往不在普通的编程教材中有所介绍,在学习者看来既似曾相识又带有一丝困惑感
在进行Linux驱动开发的过程中(或者在阅读内核源码的过程中),我们经常会遇到一些看似不寻常的用法;如果不深入了解这些特殊语法的具体含义,则可能会对代码的理解产生一定难度。
今天的分享到这里结束了哦,请好好消化吸收吧!我希望你能将所学知识长期保留在你的记忆中,并且能够深刻理解每一个细节。
学C/C++不易,此路应携手前行。
欢迎关注我的编程公众號【草莓味狸猫】!
如果你想跟着小编一起学编程的话!
可以来我的C语言C++编程学习基地 ,【点击进入】!
还有(源码,零基础教程,项目实战教学视频)!

