第一范文网 - 专业文章范例文档资料分享平台

《C陷阱与缺陷》笔记(9)

来源:用户分享 时间:2021-04-06 本文由情绪难控 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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下载服务。

《C陷阱与缺陷》笔记(9).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1186469.html(转载请注明文章来源)

相关推荐:

热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top