C中的经典,经过半个月的时间,慢慢的看了,感觉挺好的!做了点小总结
5.4 使用 errno检查错误
4-1 错误示例:
/*调用库函数*/
If(errno)
/*处理错误*/
这里没有对errno进行重新设置, errno可能是前一个执行失败的库函数的值。
在调用库函数时,应首先检测作为错误指示的返回值,确定程序执行已经失败然后再检查errno来弄清出错原因。例:/*调用库函数*/
If(返回的错误值)
检查errno
5.5 库函数 signal
5-1使用signal库函数:捕获异步事件的一种方式
#include <signal.h>
signal( signal type, handler function);
Signal type:系统头文件signal.h中定义的某些常量。 Handler function:指定事件发生时,将调用的事件处理函数。
但一个信号可能在C程序执行期间的任何时刻上发生。甚至可能出现在某些复杂库函数(如malloc)的执行过程中。因此从安全角度考虑,信号函数不应该调用上述类型的库函数。信号非常复杂棘手,而且具有一些从本质上不可移植的特性。解决这个问题最好采取“守势”,让signal处理函数尽可能的简单,并将它们组织在一起。
5-2 有getchar putchar的函数要包含头文件#include<stdio.h>,否则函数中getchar putchar宏出现的地方将被替换成getchar putchar函数,降低系统效率。
第6章 预处理器
6.1 不能忽视宏定义中的空格
1-1 define f (x)((x)-1)表示 f代表(x)((x)-1)。
6.2 宏并不是函数
2-1 宏定义中的括号不是函数调用的意思,它们是预防引起与优先级有关的问题。因此,在宏定义中最好把每个参数都用括号括起来。
2-2 错误示例(效率低而且可能是错误的):
biggest=x[0];
i=1;
while(i<n)
biggest=max(biggest,x[i++]);
初始化数组x[0]=2; x[1]=3; x[2]=1;
若max被定义成宏则上式被预处理为 biggest=((biggest)>x[i++])?(biggest);(x[i++]) 这里执行后比较和取值将进行两次使x[i++]的值发生了变化。(max宏的每个参数值都可能使用两次,一次是在两个参数比较时,一次是作为结果返回时)
解决类似问题:
1、确保宏中的参数没有副作用
例:biggest=x[0];
for(i=1;i<n;i++)
biggest=max(biggest,x[i]);
2、在max宏之外的地方把每个参数存储在一个临时变量中,若max宏不止一个程序文件,
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新资格考试认证《C陷阱与缺陷》笔记(9)全文阅读和word下载服务。
相关推荐: