Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66085
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 77
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-20 20:21
文章分类
文章存档

2015年(1)

2014年(1)

2013年(7)

分类: LINUX

2013-12-09 08:55:44

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

 

#include

void assert( int expression );

 

  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.

 

  已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

 

#include

#define NDEBUG

#include

用法总结与注意事项:

  1)在函数开始处检验传入参数的合法性如:

复制代码

 

int resetBufferSize(int nNewSize)

{

  //功能:改变缓冲区大小,

  //参数:nNewSize 缓冲区新长度

  //返回值:缓冲区当前长度

  //说明:保持原信息内容不变     nNewSize<=0表示清除缓冲区

  assert(nNewSize >= 0);

  assert(nNewSize <= MAX_BUFFER_SIZE);

  ...

}

 

复制代码

 

  2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:

 

  不好:

 

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

 

  好:

 

assert(nOffset >= 0);

assert(nOffset+nSize <= m_nInfomationSize);

 

  3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

 

  错误:

 

assert(i++ < 100);

 

  这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

 

  正确:

 

 assert(i < 100);

 i++;

 

  4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

 

  5)有的地方,assert不能代替条件过滤。

 

 

本文主要介绍va_start和va_end的使用及原理。

 

  在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。

 

  介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理:

 

1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表

void foo(...);

void foo(parm_list,...);

这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。


原文出处 没有记下来。。。。作者看到后请留言。。。。

阅读(2718) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~