打印
[牛人杂谈]

C语言assert()函数用法总结

[复制链接]
885|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2016-10-29 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
The defined macro assert refers to another macro NDEBUG which is not a part of <assert.h>. If NDEBUG is defined as a macro name in the source file, at the point where <assert.h> is included, the assert macro is defined as follows −
#define assert(ignore) ((void)0)

Library Macros

Following is the only function defined in the header assert.h −

S.N.Function & Description
1

void assert(int expression)

This is actually a macro and not a function, which can be used to add diagnostics in your C program.




沙发
稳稳の幸福|  楼主 | 2016-10-29 15:42 | 只看该作者
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:
[url=][/url]
1 #include <stdio.h> 2 #include <assert.h> 3 #include <stdlib.h> 4 int main( void ) 5 { 6        FILE *fp; 7      8        fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 9        assert( fp );                           //所以这里不会出错10        fclose( fp );11     12        fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败13        assert( fp );                           //所以这里出错14        fclose( fp );                           //程序永远都执行不到这里来15        return 0;16 }

已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>#define NDEBUG#include <assert.h>
用法总结与注意事项:
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不能代替条件过滤。


使用特权

评论回复
板凳
wahahaheihei| | 2016-10-29 17:24 | 只看该作者
这个函应该是只在调试时候才用。

使用特权

评论回复
地板
wahahaheihei| | 2016-10-29 18:09 | 只看该作者
每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

使用特权

评论回复
5
捉虫天师| | 2016-10-30 14:16 | 只看该作者
断言函数,调试时候用的

使用特权

评论回复
6
稳稳の幸福|  楼主 | 2016-11-7 12:51 | 只看该作者
好多单片机的开发阶段会用到这个东西。

使用特权

评论回复
7
dongnanxibei| | 2016-11-7 18:37 | 只看该作者
涨姿势了,这个断言只见过,从来没主动用过。

使用特权

评论回复
8
heisexingqisi| | 2016-11-7 19:35 | 只看该作者
每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

使用特权

评论回复
9
heisexingqisi| | 2016-11-7 19:43 | 只看该作者
C语言这个坑是很深的。

使用特权

评论回复
10
quray1985| | 2016-11-7 20:26 | 只看该作者
这个函数对于查错确实很有帮助的

使用特权

评论回复
11
稳稳の幸福|  楼主 | 2016-11-12 22:22 | 只看该作者
此函数只能一次检测到一个错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

3198

帖子

8

粉丝