`
mmdev
  • 浏览: 13424524 次
  • 性别: 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不能代替条件过滤

分享到:
评论

相关推荐

    深入探讨C++中的引用和ASSERT断言

    ### 深入探讨C++中的引用和ASSERT断言 #### 引用 **引用**是C++中的一项重要特性,它本质上是一个已存在的变量的别名。这意味着当我们通过引用访问一个变量时,实际上就是在直接操作那个变量。理解引用的工作原理...

    Java断言(assert)

    断言可以有多种使用方法,下面是两种常见的使用方法: 1. 简单断言 public static void main(String[] args) { boolean isOk = 1&gt;2; assert isOk; System.out.println("程序正常"); } 在上面的代码中,如果isOk...

    python assert的用处示例详解

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

    业务异常提示处理 springboot+Assert(自定义断言)

    本项目“业务异常提示处理 springboot+Assert(自定义断言)”着重于利用Spring Boot的特性来构建高效、易维护的业务逻辑,并通过自定义断言提升代码的可读性和可维护性。下面我们将详细探讨这些知识点。 1. **Spring...

    C语言断言assert的用法.pdf

    其中expression为条件表达式,如果该表达式为假(即为零),则触发assert断言错误,否则程序正常执行。通常,assert用于检查函数参数的有效性、验证逻辑运算的结果等,它通常与#ifdef DEBUG语句结合使用,使得在...

    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 它...

    1-assert(断言).pdf

    在Node.js中,`assert`模块提供了丰富的断言方法来帮助开发者确保程序的正确性。以下是对`assert`模块中各个方法的详细说明: 1. `assert(value[, message])`: 这是最基础的断言方法,它检查给定的`value`是否为真...

    python3 assert 断言的使用详解 (区别于python2)

    1. **单元测试**:在编写测试用例时,`assert`常用来验证函数或方法的返回值是否符合预期。 2. **调试**:在开发过程中,可以使用`assert`来检查程序的关键点,确保某些条件在程序运行到该点时总是为真。 3. **...

    Assert使用

    2. **使用方法**:详细介绍不同编程语言中 `Assert` 的用法,如 C++ 中的 `assert()` 函数,Java 中的 `java.util.Assert` 类,C# 中的 `System.Diagnostics.Debug.Assert()` 和 `System.Diagnostics.Trace.Assert()...

    Python3 assert断言实现原理解析

    ### Python3 assert断言实现原理 在Python编程中,`assert`语句是一种非常有用的调试工具,它可以在开发阶段帮助开发者发现程序中的错误,并提供反馈。`assert`语句的基本用法是:如果指定的表达式计算结果为`False...

    断言函数的使用方法

    本文将深入探讨断言函数的使用方法,包括其基本概念、常见应用场景、使用技巧以及潜在的限制和注意事项。 ### 断言函数assert的基本概念 断言函数`assert()`是C语言标准库中的一部分,用于在程序运行过程中检查...

    VC中ASSERT的用法

    ### VC中ASSERT的用法详解 #### 断言的基本概念 在软件开发中,断言(Assert)是一种常用的调试工具,用于验证程序中的假设条件是否成立。当断言中的条件为假时,程序会抛出错误信息并中断执行,帮助开发者定位...

    Python断言(assert)深度解析:用法、应用场景与实践技巧

    在Python编程中,断言(assert)是一种用于验证程序状态的工具,它可以帮助开发者确保代码中的某些条件为真。如果断言的条件为假,则程序会抛出一个AssertionError异常。断言通常用于捕获编程错误,验证函数参数,...

    C++ 中assert()函数用法总结

    C++ 中 assert() 函数用法总结 assert() 函数是在 C++ 编程语言中用于调试和检查代码的正确性的宏命令。它可以帮助开发者在开发过程中检测代码中的错误,从而提高代码的质量和可靠性。 assert() 函数的原型定义在 ...

Global site tag (gtag.js) - Google Analytics