C语言::assert()宏功能、原型、用法及实例 - 高小调博客

C语言::assert()宏功能、原型、用法及实例

功能

assert的功能是先计算表达式 expression ,当其值为0时先向stderr打印一条出错信息,然后调用abort()使程序异常退出。

原型

void assert( int expression );

(调用时需要添加<assert.h>头文件)

参数

expression:判断一个表达式(包括指针)结果为非零或0

返回值

无返回值

说明

assert是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

实例

/*
*本代码来源于MSDN,版权不归高小调博客所有 
*作者:互联网世界太大,我也不知道他是谁 
*日期:第一次写这篇文章的时间,我也忘了
*代码功能:非常高调的展示一下assert宏的用法 
*搜集整理:高小调博客-(http://gaoxiaodiao.com) 
*/
#include<stdio.h>
#include<assert.h>
#include<string.h>
void analyze_string( char * string );
int main(){
   char  test1[] = "abc", *test2 = NULL, test3[] = "";
   printf ( "分析字符串1: '%s'\n", test1 );
   analyze_string( test1 );
   printf ( "分析字符串2: '%s'\n", test2 );
   analyze_string( test2 );
   printf ( "分析字符串3: '%s'\n", test3 );
   analyze_string( test3 );
   return 0;
}
void analyze_string( char * string ){
    assert( string != NULL );        /* 不能为0  */
    assert( *string != '\0' );       /* 不能为空 */
    assert( strlen( string ) > 2 );  /* 长度必须超过 2 */
}

输出

assert宏实例代码输出结果

使用原则

a.使用assert捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。

b.使用assert对函数的参数进行确认。

c.在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用assert对假定进行检查。

d.一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

注意事项

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

1
2
3
4
5
6
7
8
9
10
int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度
  //说明:保持原信息内容不变     nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}

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

1
2
3
4
5
//Bad Case!
assert(nOffset>=0 && nOffset+nSize>=m_nInfomationSize);
//Good Case!
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

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

1
2
3
4
5
//Bad Case!
assert(i++ > 100);
//Good Case!
assert(i > 100);
i++;

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

e.有的地方,assert不能代替条件过滤。

小调祝你一切安好!

本文由高小调博客原创!

原文地址:http://gaoxiaodiao.com/p/2.html

如欲转载,请注明出处!

PS:大部分人都羡慕大学生活好.大学生活确实好!!!就是找不到能让我心动的妹子.

并不是因为我们学校、学院、专业女生少.

就是单纯的、很邪门的碰不到心动的妹子.

可能是我眼光比较挑、可能是学校有毒...

我时常感叹:没上大学之前是拿不下自己心动的妹子,无奈;这上了大学反而根本就碰不到让我心动的妹子,更无奈.

从某种意义上来说,这大学过的还真不如高中...(未完待续)

上一篇:
下一篇: