购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

前言

C语言诞生于贝尔实验室。1972年,Dennis Ritchie在Kenneth Lane Thompson设计的B语言基础上发展出了C语言。在C语言的主体设计完成后,Thompson和Ritchie重写了UNIX操作系统。随着UNIX操作系统的发展,C语言也得到了进一步的完善,并在1989年诞生了第一个完备的C语言标准——C89,也就是广为人知的ANSI C。尽管C语言的诞生和UNIX操作系统密不可分,但 C 语言已经成为几乎所有操作系统支持的编程语言,广泛应用于操作系统内核、基础函数库、数据库、图形系统、密码系统、多媒体编解码器等的开发中。因此,在各类编程语言排行榜上,C语言始终名列前茅。

C语言广泛应用于系统底层的开发当中,这是因为C语言是最接近计算机处理器的编程语言。C语言可产生接近汇编语言执行效率的机器指令,同时保持非常好的跨平台特性。由于操作系统内核、基础函数库、数据库等大量的基础软件使用C语言开发,甚至许多脚本编程语言(如Python)的解释器也使用C语言开发,因此将C语言称作人类迄今为止创建的整个软件生态的底座,相信没有人会提出异议。

在笔者看来,C语言最大的优点在于其设计上的完备性和简洁性。完备性在于开发者可以使用C语言实现任何想得到的功能,而简洁性确保了C语言特性的稳定。相比其他编程语言,比如C++,C语言的关键词(又称关键字或保留字)、数据类型和语法等特性非常稳定。自从C89一字不落地被国际标准化组织吸纳成为ISO/IEC 9899标准之后,国际标准化组织和国际电工委员会仅在1999年、2011年和2018年对C语言标准做了一些修正和完善,分别发布了C99、C11和C18标准(现阶段被广泛接受和使用的C语言标准仍然是C99)。这些标准之间的差异很小,且向后兼容。但假如一名20年前的C++程序员穿越到现在阅读最新的C++程序代码,一定会惊呼“宛如天书”!

在半个多世纪的计算机软件发展史上,出现了众多的编程语言,大量的编程语言昙花一现,还没流行就消失在历史的长河中,还有一些编程语言曾经盛极一时,但随后默默无闻。由于 C 语言的特殊地位,我们有理由相信它将会长盛不衰。

近几年,国内开始重视操作系统、数据库、开发工具甚至编程语言等基础软件的国产化,这些基础软件哪一个离得开C语言呢?然而,我国有大量程序员任职于互联网公司,日常使用的是JavaScript、PHP、Java、Python等编程语言,C程序员则主要活跃于嵌入式和物联网领域,人数相对较少。

除了人员数量少,算得上“八级工”水平的C程序员更是凤毛麟角。笔者在近30年的软件开发生涯中,看到过很多C程序员,即便是有多年从业经验的程序员,也不能有效使用C语言编写程序。尽管很多C程序在语法上没有什么问题——毕竟可以运行的程序起码要通过编译器的编译——但在很多方面存在或多或少的问题,具体如下。

● 不注重代码的可读性,写出来的代码没有美感和章法。

● 不会给函数、变量、结构成员等取名,甚至使用拼音。

● 不注重细节,比如定义一个字符数组作为缓冲区,随意填写其大小。

● 不严谨,对编译时出现的大量警告视而不见。

以上这些其实都是一些基础性的问题,属于代码可读性和可维护性的范畴,作为一名合格的C程序员,必须给予充分重视并纠正。相比起来,这些问题还算好解决。但如果进一步谈到C程序的常见设计和实现模式,比如设计接口、解耦代码和数据、利用子驱动程序实现模型、设计状态机等,则绝大多数C程序员会感到难以理解和驾驭。

笔者在1993年接触C语言,起初在DOS下开发C程序,1998年年底为嵌入式Linux开发窗口系统MiniGUI,并领导团队持续开发和维护MiniGUI开源项目。20多年来,MiniGUI一直广泛应用于各类嵌入式设备当中。2020年,笔者提出了HVML编程语言,并领导团队使用C/C++开发HVML编程语言的开源解释器(PurC)和渲染器(xGUI Pro)。在开发PurC的过程中,笔者观察到团队成员在使用C语言方面的诸多问题,且发现这些问题具有普遍性,于是在2021年下半年利用视频号平台发起了一项公益性直播课程“C语言最佳实践”。此课程的回放随后在Bilibili平台上发布,并获得大量好评。2022 年年初,人民邮电出版社邀请笔者将直播课程整理成书,于是便有了本书。

可以说,本书是笔者近30年编码经验的总结。全书分3篇:基础篇、模式篇和质量篇。

基础篇(第1章~第5章)从可读性和可维护性出发,阐述了如何提高代码的可读性、用好写好头文件、正确理解编译警告并消除潜在问题、定义和使用常量等,介绍了如何有效利用构建系统生成器(CMake)来维护项目,比如提高代码的可移植性、处理可选的功能模块,以及自动生成某些源代码等。C语言最为接近计算机处理器,因而可以取得最佳的性能表现,但硬币的另一面则是容易写出一些存在缺陷和安全漏洞的代码。而这些缺陷或安全漏洞往往和程序员编码时不严谨有关。本篇的内容旨在帮助C程序员理解不严谨的编码风格和漠视编译警告所带来的风险,从而为写出高质量的C代码打下基础。

模式篇(第6章~第10章)是本书的核心内容,阐述了常见的C程序接口设计模式,说明了如何在C程序中解耦代码和数据、利用子驱动程序实现模型、设计可加载模块等,介绍了状态机的概念以及在C程序中如何利用状态机实现分词器、解析器等。第6章介绍的8种C程序接口设计模式是本书的重点,在其他C语言图书中鲜有介绍。本篇的内容旨在帮助C程序员开发出具有良好的接口设计且兼顾可维护性和可扩展性的C程序。

质量篇(第11章~第13章)从性能和单元测试出发,阐述了如何避免编写低效代码、进行单元测试、使用常见的单元测试框架等,介绍了高效调试C程序的若干技巧和工具。本篇的内容旨在帮助C程序员编写兼顾性能的高质量C代码。

本书的很多示例代码来自笔者主导的如下两个开源项目。

● MiniGUI。MiniGUI是一个开源的跨平台窗口系统,支持10多种操作系统,并提供丰富的小部件/控件和开源应用程序及工具。参见GitHub上的VincentWei/MiniGUI库。

● PurC。PurC是HVML的解释器,HVML是由笔者提出的一种描述式编程语言。参见GitHub上的HVML/PurC库。

本书带有配套示例程序,供读者阅读时同步参考,参见“资源与支持”页。完整的示例程序整理在GitHub上的VincentWei/bpcp库中。

读者亦可扫描书中所附二维码在线查看更多参考资料。

本书使用了如下术语。

● 结构体(structure):用于指代C程序中使用struct关键词定义的数据结构。

● 成员(member):结构体中的成员;为防止混淆,本书不使用字段(field)这一术语。

● 头文件(header file):特指.h文件。

● 源文件(source file):特指.c文件。

魏永明
2024年8月 H2bjxUGj0o8cB/xI74q//ni2CluNIVIJYGURGYHi15CM8egxU2fXAp/CJ3WS7c+9

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开