基本信息
- 原书名:The Standard C Library
- 原出版社: Prentice Hall PTR
- 作者: (美)P.J.Plauger
- 译者: 卢红星 徐明亮 霍建同
- 丛书名: 图灵程序设计丛书 C/C++系列
- 出版社:人民邮电出版社
- ISBN:9787115172860
- 上架时间:2009-6-23
- 出版日期:2009 年7月
- 开本:16开
- 页码:473
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > C/Turbo C > C
编辑推荐
C标准库“圣经”.
提供完整源代码,全面深入阐述库函数的实现与运用..
C程序员必备参考书...
内容简介
作译者
目录
0.1 背景知识1
0.2 C 标准的内容 3
0.3 库的使用7
0.4 库的实现9
0.5 库的测试13
0.6 参考文献15
0.7 习题15
第1章 (assert.h)17
1.1 背景知识17
1.2 C 标准的内容18
1.3 (assert.h) 的使用18
1.4 (assert.h) 的实现20
1.5 (assert.h) 的测试22
1.6 参考文献23
1.7 习题23
第2章 (ctype.h) 25
2.1 背景知识25
2.2 C 标准的内容28
2.3 (ctype.h) 的使用 30
译者序
C 语言更是如此!尽管它及它所附带的C 标准库中隐藏着太多的晦涩陷阱,但用C 语言编写的程序却已深入到软件行业的各个关键角落,使我们不得不要花大力气“过分”地钻研它。已经有太多的书关注了C 语言本身及C 标准库应如何使用,本书却独树一帜,它将告诉你C 标准库是如何用标准C 来实现的。学习C 标准库本身的实现,就是学习C 语言最好的教材,因为其实现过程将会把使用C 语言编写具有工业强度的健壮代码所需的技巧展现得淋漓尽致。
如果想仔细探究C 标准库的实现细节,P. J. Plauger 的这本书将是你最好的选择 。C 标准库由在15 个头文件中声明的函数、类型定义和宏组成,每个头文件或多或少代表了一定范围的编程功能。有人说,标准库可以分为3 组,如何正确和熟练地使用它们,可以相应地区分出3种层次的C 程序员:
合格程序员,(ctype.h)、(stdio.h)、(stdlib.h)、(string.h);
熟练程序员,(assert.h)、(limits.h)、(stddef.h)、(time.h);
优秀程序员, (float.h)、(math.h)、(error.h)、(locale.h)、(setjmp.h)、(signal.h)、(stdarg.h)。
如果你反复研读本书,并能将本书所提供的9 000 余行关键实现代码中所蕴藏的C 语言精
髓熟稔地应用到你正要或将要从事的实际开发中去,那么,毫无疑问,你已完全超越了上面
“优秀程序员”的标准,成为“超优秀程序员”!
希望这本令我在翻译过程中获益匪浅的书也能给你带来美妙而独一无二的阅读享受!
最后,感谢人民邮电出版社图灵公司刘江和傅志红编辑的邀请和信任,他们踏实负责、兢兢业业的工作精神极大地鞭策了我;感谢霍建同、贾彦磊、万振杰等参与了部分章节的初译及整理工作;感谢郑州大学的卢红星老师认真审阅和复译全稿,他深厚的技术积淀、丰富的教学经验以及一丝不苟、精益求精的严谨态度也令我在翻译过程中获益良多;更要感谢我的妻子徐静,谢谢你的爱。由于译者经验和水平有限,译文难免有不妥之处,敬请读者指正并与我交流:develop_game@yahoo.com.cn。...
徐明亮
前言
库函数的实现代码尽可能地使用标准C,这样做有3 个设计目的:首先,它使代码具有可读性和示范性;其次,它使代码在各种计算机体系结构间具有高度可移植性;最后,它能使编写的代码兼顾正确性、性能和规模各方面。
教你如何编写C 程序并不是本书的目的。本书假定你能读懂简单的C 程序,对于那些稍有难度的代码,我会向你解释其中的难点和技巧。
C 标准库
C 标准库是非常强大的,它在多种不同的环境下提供了相当多的功能:它允许用户和实现者使用明确定义的名字空间;它对其所提供的数学函数的健壮性和精确性有非常严格的要求; 它率先对适应不同文化习惯的代码提供支持,包括那些拥有很大字符集的文化习惯。
为了能有效利用标准库所提供的强大功能,用户应该了解其实现上的很多隐晦细节。库的实现者必须向用户提供这些细节,以使他们更好地使用标准库。C 标准中并没有把这些隐晦的实现细节都很好地描述清楚,因为制定标准的主要目的并不是给库的实现者提供指导。与ANSI C 标准一起发布的Rationale 也没有对这些细节作出很好的解释。Rationale 要服务的对象范围很广,而关注这些细节的标准实现者只是众多服务对象的一部分。
在C 的传统实现中并不能找到上面提到的新特性。现在的实现已经可以支持国际化开发中的区域设置(locale)概念。每个区域设置都对应于专属的某个国家、某种语言或者某个职业的特定习惯,一个C 程序可以通过修改和查询区域设置来动态地适应多种文化。现在的实现也能支持很大的字符集,如字符数量众多的汉字。C 程序能把它们作为多字节字符(multibyte character)或者宽字节字符(wide character)处理。它也能在这两种形式之间转换。在迅速加剧的市场竞争中,这就使得程序的编写更加简单和标准。
因为以前对这些新特性几乎不存在相应的编程艺术,所以即使是最有经验的C 程序员,在使用区域设置、多字节字符和宽字节字符的时候也需要一些指导。所以,这些主题在这里给予了特殊的关注。
细节
本书向用户和实现者解释了库的设计用意和可能用法。通过提供C 标准库中所有库函数的实际实现,本书用例子告诉你怎样处理它的细节。在那些没有明确是最好实现方法的地方,它还讨论了可供选择和折中的办法。
一个涉及细节的例子是函数getchar 。头文件(stdio.h) 原则上可以用下面的宏来屏蔽函数的声明:
#define getchar() fgetc(stdin) /* NOT WISE! */
然而,它却不应该这样做,一个合理(即使没有用)的C 程序是
#include (stdio.h)#undef fgetc
int main(void) { int fgetc = getchar();/* PRODUCES A MYSTERIOUS ERROR */
return (0);
}
当然,这个例子有点极端,但它却阐述了即使是一个很好的程序员也可能犯的错误。用户有权要求尽可能少地出现这类奇怪的错误,所以设计者就有义务避免出现这些奇怪的错误。
我最终确定的getchar 宏的形式是
#define getchar () (_Files[0]-)_Next ( _Files[0]-)_Rend \ ? *_Files[0]-)_Next++ : (getchar) ())
媒体评论
——C/C++用户协会...
书摘
编写出好的数学函数是一件很难的事。现在的一个普遍现象是有些程序设计语言的实现提供的数学函数存在严重的缺陷。它们可能会对具有明确定义的函数值的参数产生中间值溢出,或者丢失很多位的有效数字,某些情况下还会产生错误结果。
虽然实现人员有充足的时间来研究这些问题,但仍然有那么多的缺陷,这一点让人奇怪。计算机最早就用于解决各种工程或者数学难题,事实上,最早的库几乎完全由计算常用数学函数的函数组成。20世纪50年代出现的FORTRAN,就是以它的功能FORmula TRANslation(公式转换)的缩写来命名的,那些公式是由很多数学函数组成的。
在过去的几十年中,实现人员变得越来越老练。IEEE754浮点数标准对浮点算术的安全和一致是一个重要的里程碑。(参考第4章中对浮点数表示和IEEE754标准的讨论。)但是从另一个角度来说,IEEE754又加重了实现人员的负担。因为它引入了渐进下溢,对无穷大和非数的编码,不同的精度要求不同大小的指数等复杂的东西。所以很多实现通常只支持IEEE 754标准的一部分,而不是全部。
我花在编写和调试中声明的函数的时间和这个库中其他所有的函数加起来的时间差不多,这的确让我有点吃惊。在过去的二十多年的时间中,我对每一个数学库函数都至少预先编写过3遍所以你可能会认为我应该有足够的时间来避免错误的发生,我也曾这样认为,但事实并非如此。