#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行。
请看下面的程序清单badptr.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_process]# ./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 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不能代替条件过滤
相关推荐
使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要...
C语言断言assert的用法.pdf
本文实例讲述了Node.js assert断言原理与用法。分享给大家供大家参考,具体如下: node.js官方API中文版 http://nodeapi.ucdok.com/#/api/assert.html assert 模块主要用于编写程序的单元测试时使用,通过断言可以...
python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假。 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 assert的语法格式: assert expression 它...
Junit通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比较,对于void类型的方法,我们无法从它的return语句获得具体的返回值。...
【用途】:断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。 【语法】: assert [removed]表达式) ...
ASSERT( pcage!= NULL ) ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) ) 编译过程中判断语句的成功(合法)函数 是一种断言语句。主要用来调试程序 就是说Debug(调试)的时候,ASSERT( *******) 这句要...
assert, 在库和业务模型中,使用瘦断言库 assert 一个简单的php库,它包含在业务模型中输入验证( 不过滤)的断言和保护方法。 库可以用于在输入数据上实现 pre-/post条件。思想是减少在模型中实现断言的代码量,同时...
用法 # in test/my_tests.rb require "assert" class MyTests < Assert :: Context test "something" do assert_that ( 1 ) . equals ( 1 ) end end $ assert test/my_tests.rb Loaded suite (1 test) ...
Python中断言的语法非常简单,只需要使用assert关键字即可。assert语句的一般形式如下: assert expression [, arguments] 其中,expression是一个布尔表达式,如果为False,则抛出AssertionError异常。arguments是...
C语言的断言函数,在调试的时候有可能会用到。
python中断言的用法 Python中断言的用法 Python中断言是一种用于检查代码中假设的正确性的方法。它是一种用于在代码中检查错误的工具,可以帮助程序员在代码中发现错误并及时修复。在Python中,断言是一个关键字,...
下面小编就为大家带来一篇C++ Assert()断言机制原理以及使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
C语言中的ASSERT(断言)宏是嵌入式软件开发人员可以使用的最好的调试工具之一。虽然ASSERT功能强大,但我很少看到它被实施,并且在一些使用它的案例中,它的实施要么是有瑕疵的要么是不正确的。以下一些技巧将不仅...
Python延迟断言延迟又名。 python的软断言几个功能: - No Dependenices on any other framework/library.- ...在Lambda中使用断言库将断言调用传递为 expect ( lambda : self . assertListEqual ([ 4 , 5 , 6 , 2