`
ydbc
  • 浏览: 718308 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

assert 断言用法总结

 
阅读更多

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

#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不能代替条件过滤

分享到:
评论

相关推荐

    python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要...

    C语言断言assert的用法.pdf

    C语言断言assert的用法.pdf

    Node.js assert断言原理与用法分析

    本文实例讲述了Node.js assert断言原理与用法。分享给大家供大家参考,具体如下: node.js官方API中文版 http://nodeapi.ucdok.com/#/api/assert.html assert 模块主要用于编写程序的单元测试时使用,通过断言可以...

    Python断言assert的用法代码解析

    python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假。 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 assert的语法格式: assert expression 它...

    Junit测试Void方法

    Junit通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比较,对于void类型的方法,我们无法从它的return语句获得具体的返回值。...

    Python assert (断言) 基本用法

    【用途】:断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。 【语法】: assert [removed]表达式) ...

    VC中ASSERT的用法

    ASSERT( pcage!= NULL ) ASSERT( pcage-&gt;IsKindOf( RUNTIME_CLASS( CAge ) ) ) 编译过程中判断语句的成功(合法)函数 是一种断言语句。主要用来调试程序 就是说Debug(调试)的时候,ASSERT( *******) 这句要...

    assert, 在库和业务模型中,使用瘦断言库.zip

    assert, 在库和业务模型中,使用瘦断言库 assert 一个简单的php库,它包含在业务模型中输入验证( 不过滤)的断言和保护方法。 库可以用于在输入数据上实现 pre-/post条件。思想是减少在模型中实现断言的代码量,同时...

    assert:断言风格测试框架

    用法 # in test/my_tests.rb require "assert" class MyTests &lt; Assert :: Context test "something" do assert_that ( 1 ) . equals ( 1 ) end end $ assert test/my_tests.rb Loaded suite (1 test) ...

    python中断言的用法.docx

    Python中断言的语法非常简单,只需要使用assert关键字即可。assert语句的一般形式如下: assert expression [, arguments] 其中,expression是一个布尔表达式,如果为False,则抛出AssertionError异常。arguments是...

    断言函数的使用方法

    C语言的断言函数,在调试的时候有可能会用到。

    python中断言的用法(1).docx

    python中断言的用法 Python中断言的用法 Python中断言是一种用于检查代码中假设的正确性的方法。它是一种用于在代码中检查错误的工具,可以帮助程序员在代码中发现错误并及时修复。在Python中,断言是一个关键字,...

    C++ Assert()断言机制原理以及使用方法

    下面小编就为大家带来一篇C++ Assert()断言机制原理以及使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    嵌入式系统/ARM技术中的 在C语言中用ASSERT调试的八个技巧

    C语言中的ASSERT(断言)宏是嵌入式软件开发人员可以使用的最好的调试工具之一。虽然ASSERT功能强大,但我很少看到它被实施,并且在一些使用它的案例中,它的实施要么是有瑕疵的要么是不正确的。以下一些技巧将不仅...

    delayed-assert:延迟又名。 python的软断言

    Python延迟断言延迟又名。 python的软断言几个功能: - No Dependenices on any other framework/library.- ...在Lambda中使用断言库将断言调用传递为 expect ( lambda : self . assertListEqual ([ 4 , 5 , 6 , 2

Global site tag (gtag.js) - Google Analytics