c<assert.h>函数

C 里面的宏
   宏名: assert 
    功 能: 测试一个条件并可能使程序终止 
    用 法: void as sert(int test); 
    程序例: 
    #include <assert.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    struct ITEM { 
    int key; 
    int value; 
  }; 
    /* add item to list, make sure list is not null */ 
    void additem(struc t ITEM *itemptr) { 
    assert(itemptr != NULL); 
    /* add item  to list */ 
  } 
    int main(void) 
  { 
    additem(NULL); 
    return 0; 
  } 
   assert() 宏用法 
    assert 宏的原型定义在<as sert.h>中, 其作用是如果它的条件返回错
误,则终止程序执行,原型定义: 
    #include <assert.h> 
    void assert( i nt expression ); 
    assert 的作用是先计算表达式 expr ession ,如果其值为假(即为 0),
那么它先向 stderr 打印一条出错信息, 
    然后通过调用 abort 来终止程序运行。 
    请看下面的程序清单 bad ptr.c: 
    #include <stdio.h> 
    #include <assert.h> 
    #include <stdlib.h> 
    int main( void ) 
  { 
    FILE *fp; 
    fp = fopen( "test. txt", "w" );//以 可写的方式打开一个文件,如
果不存在就创建一个同名文件 
    assert( fp ); // 所以这里不会出错 
    fclose( fp ); 
    fp = fopen( "noexitfile.txt ", "r" );//以只 读的方式打开一个文
件,如果不存在就打开文件失败 
    assert( fp ); // 所以这里出错 
    fclose( fp ); // 程序永远都执行不到这里来 
    return 0; 
  } 
    [root@localhost error_process]# gcc badptr.c 
    [root@localhost error_proce ss]# ./a.out 
    a.out: badptr.c:14: main: Assertion `fp' failed. 
    已放弃 
    使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额
外的开销。 
    在调试结束后,可以通过在包含# include <assert.h>的 语句之前插入
#define NDEBUG 来禁用 assert 调 用,示例代码如下: 
    #include <stdio.h> 
    #define NDEBUG 
    #include <assert.h> 
    用法总结与注意事项: 
    1)在函数开始处检验传入参数的合法性 
    如: 
    int resetBufferSiz e(int nNewSize) 
  { 
  //功能:改变缓冲区大小, 
    //参数:nNewSize 缓冲区新长度 
    //返回值:缓冲区当前长度 
    //说明:保持原信息内容不变 nNewSize<=0 表示清除缓冲区 
    assert(nNewS ize >= 0); 
    assert(nNewSize <=  MAX_BUFFER_SIZE); 
    ... 
  } 
    2)每个 assert 只检验一个条件,因为同时检验多个条件时,如果断言失
败,无法直观的判断是哪个条件失败 
    不好: assert(nOffset>=0 && nOffset+nSize< =m_nInfomationSize); 
    好: assert(nOf fset >= 0); 
    assert(nOffset+nSize <= m_nInfomationSize); 
    3)不能使用改变环境的语句,因为 assert 只在 DEBUG 个生效,如果这么
做,会使用程序在真正运行时遇到问题 
    错误: assert (i++ < 100) 
    这是因为如果出错,比如在执行之前 i=100,那么这条语句就不会执行,
那么 i++这条命令就没有执行。 
    正确: assert(i < 100) 
    i++; 
    4)assert 和后面的语句应空一行,以形成逻辑和视觉上的一致感 
    5)有的地方,assert 不能代 替条件过滤 
   注意:当对于浮点数: 
    #include<assert.h> 
    // float pi=3.14; 
    // assert(pi =3.14); // 
    float pi=3.14f ; 
    assert (pi=3.14f ); 
    ------------------------------------------------ --------- 
    在 switch 语句中总是要有 default 子句 来显示信息(Assert)。 
    int number = S omeMethod(); 
    switch(number) 
  { 
    case 1: 
    Trace.WriteLine("Case 1:"); 
    break; 
    case 2: 
    Trace.WriteLine("Case 2:"); 
    break; 
    default : 
    Debug.Assert (false); 
    break; 
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值