首页 > 其他分享 >解读《C标准库》

解读《C标准库》

时间:2023-06-21 10:34:43浏览次数:22  
标签:本书 实现 代码 解读 标准 使用 getchar


解读《C标准库》

C 标准库》将告诉你如何使用符合 C 语言的 ANSI/ISO 标准的库函数 。 因为已经有很多书出色地讲解了 C 语言本身 , 所以本书只专注于 “ 库 ” 这个话题 。 本书还会告诉你 C 标准库是如何实现的 。 本书提供了大约 9 000 行测试过的可实际工作的代码 。 我相信 , 看了 C

解读《C标准库》_character

库函数的实现代码尽可能地使用标准 C , 这样做有 3

教你如何编写 C 程序并不是本书的目的 。 本书假定你能读懂简单的 C

为了能有效利用标准库所提供的强大功能 , 用户应该了解其实现上的很多隐晦细节 。 库的实现者必须向用户提供这些细节 , 以使他们更好地使用标准库 。 C 标准中并没有把这些隐晦的实现细节都很好地描述清楚 , 因为制定标准的主要目的并不是给库的实现者提供指导 。 与 ANSI C 标准一起发布的 Rationale 也没有对这些细节作出很好的解释 。 Rationale

在 C 的传统实现中并不能找到上面提到的新特性 。 现在的实现已经可以支持国际化开发中的 区域设置 ( locale ) 概念 。 每个区域设置都对应于专属的某个国家 、 某种语言或者某个职业的特定习惯 , 一个 C 程序可以通过修改和查询区域设置来动态地适应多种文化 。 现在的实现也能支持很大的字符集 , 如字符数量众多的汉字 。 C 程序能把它们作为 多字节字符 ( multibyte character ) 或者 宽字节字符 ( wide character

因为以前对这些新特性几乎不存在相应的编程艺术 , 所以即使是最有经验的 C 程序员 , 在使用区域设置 、 多字节字符和宽字节字符的时候也需要一些指导 。 所以 , 这些主题在这里给予了特殊的关注 。

细节

本书向用户和实现者解释了库的设计用意和可能用法 。 通过提供 C

一个涉及细节的例子是函数 getchar 。 头文件 <stdio.h> 原则上可以用下面的宏来屏蔽函数的声明 :

#de f ine getchar() fgetc(stdin) /* NOT WISE! */

然而 , 它却不应该这样做 , 一个合理 ( 即使没有用 ) 的 C

#include <stdio.h>#undef fgetc
int main(void) { int fgetc = getchar();   /* PRODUCES A MYSTERIOUS ERROR */ 
return (0); 
}

当然 , 这个例子有点极端 , 但它却阐述了即使是一个很好的程序员也可能犯的错误 。 用户有权要求尽可能少地出现这类奇怪的错误 , 所以设计者就有义务避免出现这些奇怪的错误 。

我最终确定的 getchar

#de f ine getchar () (_ Fi les[0]->_Next < _ Fi les[0]->_Rend / ? *_ Fi les[0]->_Next++ : (getchar) ())

它和上面第一次给出的那个显而易见 ( 而且更具可读性 ) 的形式大不相同 。 第 12

库的设计

本书还有一个目的 , 那就是从一般角度教授程序员怎样设计和实现库 。 从本质上讲 , 程序设计语言提供的库是一个混合的 “ 袋子 ” 。 库的实现者要具备非常广泛的技巧才能处理这个 “ 袋子 ”

已经有很多好书告诉你怎样编写数学函数 , 也有很多书专门介绍某种特定用途的库 。 这些都是告诉你怎样使用现有的库 。 有些书甚至证明某个库的各种设计方案抉择的正确性 。 很少有书致力于告诉读者全面地构建一个库要求具备的技能 。

可复用性

很多书都介绍了设计和实现软件的一般性原则 。 这些书中提到的方法有结构化分析 、 结构化设计 、 面向对象设计和结构化编程等 。 这些书中的大部分例子只考虑了为某个应用编写的程序 。 然而 , 这些原则和方法也同样适用于可复用的库的实现 。但可复用性的目标进一步提高了要求 。 从结构化设计的角度来看 , 如果一个库函数没有很高的内聚性 , 它就不太可能有新的用途 。 同样 , 如果它不具备低耦合性 , 它就会更难使用 。 简单地说 , 库函数一定要隐藏它的实现细节并且提供完整的功能 。 否则 , 从面向对象的角度看 , 它们不能实现可复用的数据抽象 。

所以本书的最终目的是讨论构建库所特有的设计和实现问题 。 C 标准库的设计是固定的 。 然而 , 它从很多方面来看都是一个好的设计 , 值得讨论 。 C

本书的结构

本书的结构基本对应 C 标准库本身 。 标准库中 15

在本书的每一章中 , 我都摘录了 ISO C 标准的相关部分 。( 除了格式细节 , ISO 和 ANSI 的 C 标准是完全相同的 。) 这些摘录补充说明了库的每一部分通常是怎样使用的 。 它们也使本书成为一个更完整的参考手册 ( 当然本书比单独阅读 C

每一章最后都附有参考文献和配套习题 。 假如本书作为大学的教材使用 , 这些习题可以当成作业 。 很多习题都只是简单的代码改写 , 它们可以把某个知识点讲得更清楚或者能够说明在实现上可以做一些合理的修改 。 那些更具有挑战性的题目都做了标记 , 可以将它们作为那些长期项目的基础 , 而自学者则可以把这些习题当作深入思考的 入 口点 。

代码

本书中出现的代码已经在 Borland 、 GNU 项目和 VAX ULTRIX 的 C 编译器上进行了测试 。 它通过了广泛使用的 Plum Hall Validation Suite 的库函数的测试 , 也通过了那些专门为 C 实现设计的 、 发现 C

同时也请注意本书的代码是受版权保护的 。 它没有放置在公共域中 , 也不是共享软件 。 和那些自由软件基金会 ( GNU 项目 ) 发布的代码不同 , 它不受 “ copyleft ”

合理使用

你可以把书中的代码转变为电子版的形式 , 供个人使用 。 你也可以从堪萨斯州劳伦斯市的 C 用户组那里购买机器可识别的代码 。 无论哪种情况 , 你对代码的使用都要遵守版权法关于 “ 合理使用 ”

除了以上谈到的 , 我允许合理使用范围之外的一种重要用途 。 你可以编译库中的部分并且把生成的二进制目标模块和你自己的代码连接生成可执行文件 。 无限发布这样的可执行文件是允许的 。 对这样的副本我不要求任何权利 。 但是 , 我强烈要求你声明库 ( 在你的文件中 ) 的存在 , 不论你用了多少 , 也不论是修改过的还是没有修改的 。 请在可执行文件的某个地方把下面的文字包含进去 : “ 本作品的部分代码源自 The Standard C Library , copyright (c) 1992 by P. J. Plauger, Prentice-Hall 出版社出版 , 这些代码已获授权使用 。 ”

许可

你也可以被授权做更多的事 。 你可以以二进制目标模块的形式发布整个库 , 甚至可以发布本书中的源文件的副本 , 不论是否修改过 。 简单地说 , 你可以把整个库合并到一个让人们使用它来编写可执行程序的产品中 。 但是 , 所有的这些都需要许可证 。 你可以购买许可证 。 如果你想购买许可证而且想不断地获得库的支持 , 请和夏威夷州卡姆艾拉市的 Plum Hall

虽然上面的几段有很浓的商业色彩 , 但我的主要目的不是推销一个商业产品 。 我非常信任 C 标准 , 也已经很努力地参与了它的制定 。 我花了很大的精力制定 C

P. J. Plauger

邦迪 , 新南威尔士

标签:本书,实现,代码,解读,标准,使用,getchar
From: https://blog.51cto.com/u_15767091/6527616

相关文章

  • 全面解读Objective-C语言及Cocoa特性——《Objective-C基础教程》
    媒体评论“这是我读过的最好的一本编程书。我从头到尾逐字逐句地读完了它,可读性真强啊!试问,现在有几本技术书能达到这种程度?”——Amazon读者评论“这本书结构清晰,逻辑性强,风格幽默……借助本书,你可以毫不费力地从一个初学者摇身一变升级为优秀的Objective-C编程人员。”——Ama......
  • GWAS:表型的标准化(the normalization of phenotype)
    GWAS表型的标准化方法一般有Quantilenormalization、Inverseranknormalization、Z-scorenormalization等。各自区别如下:一、Quantilenormalization该方法将每个样本中表型值进行排序,然后将其规范化到一个标准分布,通常是正态分布。规范化是通过将每个样本的分布等同于目标......
  • 蚂蚁集团联合牵头的行业标准发布,规范移动应用开发云平台技术应用
    近日,工业和信息化部批准发布了全国首个移动应用开发云平台的行业标准《移动应用开发云平台技术要求》(YD/T4106-2023)。该标准的发布将大力促进移动应用开发云平台技术在互联网领域的应用,对推动我国移动应用云平台技术发展具有重要意义。这一标准于2020年由蚂蚁集团立项,联合中国信息......
  • 论文解读|基于RealSense的三维散乱部件点云分割
    原创|文BFT机器人01摘要本文提出了一种针对垃圾拾取系统中点云分割的算法。该算法使用低成本的深度相机RealSense获取点云数据,并对点云数据进行滤波处理和分割,最终将分割后的子块片段独立地连接起来,形成完整的工件模型。通过测试案例验证了该算法的有效性和实用性。图1工作台上......
  • 论文解读 | 皮质电图系统与软机器人致动器的完美结合
    原创|文BFT机器人01研究内容主要研究内容是关于一种电皮层图谱系统的部署,该系统使用软体机器人致动器。论文详细介绍了该系统的制造和实验方法,并提供了相关的图表和参考文献。该系统的设计旨在提高电皮层图谱系统的灵活性和可植入性,以便更好地监测脑电信号。02创新点1.该研究提......
  • 解决开发者“兼容”难题,OpenTiny技术探索与应用解读
    简介:OpenTiny是一套企业级组件库解决方案,适配PC端/移动端等多端,涵盖Vue2/Vue3/Angular多技术栈,拥有主题配置系统/中后台模板/CLI命令行等效率提升工具,可帮助开发者高效开发Web应用。6月21日16:30-18:00华为云开源DTSE技术布道师曾令卡将带来**《解决开发者“兼容”......
  • MQTT 生产者(异步)代码解读
    一、问题引入MQTT使用也有一段时间了,包括同步和异步的使用。这里根据官方案例和本人的理解,记录以下学习过程。二、解决过程简要介绍编写MQTTProducer的消息发布(异步)过程:第1步:创建客户端LIBMQTT_APIintMQTTAsync_create(MQTTAsync*handle,constchar*serverURI,con......
  • MQTT 生产者(同步)代码解读
    一、问题引入官方给出了MQTTClient的同步和异步发布的例子,本随笔就是同步发布的example。同步和异步都有一套API函数和结构体。同步发布消息算是最简单的案例了,这里总结一下代码。二、解决过程简要介绍编写MQTTProducer的消息发布(同步)过程:第1步:创建客户端LIBMQTT_APIi......
  • 【web开发】PHP命名空间中的子空间和公共空间详解及相关术语解读
    前言PHP的命名空间和文件系统的结构很像,文件夹可以有子文件夹,命名空间中也可以定义子空间来描述各个空间之间的所属关系。比如:cart购物车和order订单这两个模块都处于同一个shop商城项目内,通过命名空间子空间表达关系的:<?phpnamespaceshop\cart;classDemo{ //类的成员}name......
  • 浅析开源容器标准——OCI
    1、导语容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准。此后,为了推进容器生态的健康发展。在Linux基金会的主导下,Docker和各大云厂商Google,Amazon,CloudFoundary,Microsoft积极响应于2015年成立了"OpenContainerInitiative",旨在主导容器的生态发......