第287页 | C Primer Plus 中文版 | 阅读 ‧ 电子书库

同步阅读进度,多语言翻译,过滤屏幕蓝光,评论分享,更多完整功能,更好读书体验,试试 阅读 ‧ 电子书库

16.11 诊断库

由头文件assert.h支持的诊断库是设计用于辅助调试程序的小型库。它由宏assert()构成。该宏接受整数表达式作为参数。如果表达式值为假(非零),宏assert()向标准错误流(stderr)写一条错误消息并调用abort()函数以终止程序(在头文件stdlib.h中定义了abort()函数的原型)。assert()宏的作用为:标识出程序中某个条件应为真的关键位置,并在条件为假时用assert()语句终止该程序。通常,assert()的参数为关系或逻辑表达式。如果assert()终止程序,那么它首先会显式失败的判断、包含该判断的文件名和行号。程序清单16.16是一个简短的示例程序。在对z求平方根前,程序诊断z的值是否大于或等于0。程序还错误地减去一个值而不是加上该值,这样使z有可能获取不该使用的值。

程序清单 16.16 assert.c程序

下面是一个运行示例:

具体的提示可能因为编译器的不同而不同。一个可能会使人困惑的问题是这条消息并不是声称z>=0,而是声称z>=0这个条件没有得到满足。

使用if语句也可以完成类似的工作:

但是assert()方式有几个好处。它能自动识别文件,并自动识别发生问题的行号。另外,还有一种无需改变代码就能开启或禁用assert()宏的机制。如果您认为已经排除了程序的漏洞,那么可把宏定义

放在assert.h包含语句所在位置前,并重新编译该程序。编译器将禁用文件中所有的assert()语句。如果程序又出现问题,可以去除这个#define指令(或者把它注释掉)并重新编译,这样就重新启用了assert()语句。

请支持我们,让我们可以支付服务器费用。
使用微信支付打赏


上一页 · 目录下一页


下载 · 书页 · 阅读 ‧ 电子书库