第16章 C预处理器和C库 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程序

/*assert.c --使用assert()*/
#include <stdio.h>
#include <math.h>
#include <assert.h>

int main()
{
    double x,y,z;
    puts("Enter a pair of numbers(0 0 to quit): ");
    while(scanf("%lf%lf",&x,&y) == 2
          && (x!=0 || y!=0))
    {
        z=x*x - y*y; /*should be +*/
        assert(z>=0);
        printf("answer is %f\n",sqrt(z));
        puts("Next pair of numbers: ");
    }
    puts("Done");

    return 0;
}

下面是一个运行示例

Enter a pair of numbers(0 0 to quit):
4 3
answer is 2.645751
Next pair of numbers:
5 3
answer is 4.000000
Next pair of numbers:
3 5
Assertion failed: z>=0, file C:\Documents and Settings\Administrator\My Document
s\C\13.6\main.c, line 14

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

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

if(z<0)
{
    puts("z less than 0");
    abort();
}

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

#define NDEBUG

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

转载于:https://my.oschina.net/idreamo/blog/1492217

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值