这本书是讲的是“如何设计、实现、和有效使用C语言库函数,掌握创建可重用C语言软件模块技术。重点阐述如何用一种与语言无关的方法将接口设计实现独立出来,从而用一种基于接口的设计途径创建可重用的API“。
1、其中提到的算法工程,也就是包装数据结构以供应用程序使用。
2、文学程序,也就是将一个程序划分成各个模块,模块之间大小不一,可以嵌套。讲述代码的时候尽可能按照最适于理解的顺序给出,而不是按语言所硬性规定的顺序。
3、在程序设计风格中,库的设计和实现是困难的。在通用性,简单性和效率三个约束之间,我们必须小心翼翼,谨慎前行。也就是说以后在自定义函数的时候,参数的类型,参数的个数以及函数的返回值方面也要从这个三方面着手。又因为可靠性比效率更重要,与交付足够快的可靠软件相比,交付快速但会崩溃的软件,从长远看来代价更高。
“程序能否更容易被阅读和理解,比使程序更容易被计算机编译更为重要。”
比如文中提到的一些细节方面,如变量的声明应该靠近于其第一次使用的地方(可能在代码块中);在可能的情况下,局部变量的声明在使用变量的复合语句的开始处;过程和函数的名称,应能反映过程完成的工作以及函数的返回值。
4、关于注释,如果代码很清晰,且使用了良好的命名和缩进惯例,则这样的代码通常是自明的。仅当进行解释时,(例如解释数据结构的细节,算法的特例以及异常情况)才需要注释。编译器无法检查注释是否与代码一致,误导的注释通常比没有注释更糟糕。
5、在谈到库函数strcpy将一个字符串复制到另一个字符串中并返回目标字符串的时候,有下列做法:
① char *strcpy(char dst[],const char src[])
{
int i;
for(i=0;src[i] !='\0';i++)
{
dst[i]=src[i];
}
dst[i]='\0';
return dst;
}
② char *strcpy(char *dst,const char *src)
{
char *s=dst;
while(*dst++=*src++); /*这里也有人用while((*dst++=*src++) !='\0'); 但这个在一些C编译器和相关工具中,在发现赋值操作的结果用作条件表达式时会发出警告,因为这种用法是一个常见的错误来源。*/
return s;
}
这个为指针版本,它使用通常的惯用法将赋值、指针递增和测试赋值操作的结果合并为单一的赋值表达式。