ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
原型定义:
#include <assert.h>
void assert( int expression_r_r_r );
assert的作用是现计算表达式 expression_r_r_r ,如果其值为假(即为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只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。
而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
相关推荐
### 深入探讨C++中的引用和ASSERT断言 #### 引用 **引用**是C++中的一项重要特性,它本质上是一个已存在的变量的别名。这意味着当我们通过引用访问一个变量时,实际上就是在直接操作那个变量。理解引用的工作原理...
C++中的`assert()`函数是一种调试工具,用于在开发阶段检查程序中可能存在的逻辑错误。它的主要作用是在表达式结果不满足预期时提供反馈,并停止程序执行,帮助开发者定位问题。`assert()`定义在`<cassert>`头文件中...
本文深入探讨了 C++ 中的static_assert关键字的作用、用法及其在编译期检查中的重要性。通过详细的代码示例,阐述了如何利用static_assert对代码中的各种条件进行静态验证,包括类型特征、常量表达式、模板参数约束...
nlohmann/json库提供了异常处理机制,当发生错误时会抛出`json::parse_error`异常。你应该捕获这些异常以处理错误情况。 5. **遍历JSON**: - 对于数组类型的JSON,可以使用迭代器或范围for循环遍历。对于对象类型...
- Utility库:提供一些辅助功能,如BOOST_STATIC_ASSERT用于编译时断言,checked_delete用于安全地删除指针,以及enable_if等类型特性。 - Operators库:提供了一组操作符重载功能,可以被用于增强类的行为。 - ...
1. 如果使用普通的处理方式(如ASSERT、return等)已经足够简洁明了,请不要使用异常处理机制。 2. C++异常处理机制比C语言的setjmp、longjmp机制更为优秀,可以处理任意类型的异常。用户可以人为地抛出任何类型的...
在Microsoft Visual C++ (VC) 开发环境中,`assert` 是一个非常重要的调试工具,它允许程序员在代码中设置检查点,确保程序在特定条件下的正确性。在本篇文章中,我们将深入探讨如何在VC中使用`assert`断言,以及它...
学习这些内容将帮助开发者深入理解C++语言的机制,掌握面向对象和泛型编程的精髓,以及如何有效利用C++标准库来编写高效且可维护的代码。通过阅读这两本书,开发者将能够熟练运用C++11的新特性,提升自己的编程技能...
实现通常包括记录错误发生的文件名和行号等信息,有时还会包含无限循环或其他错误处理机制,以确保程序在遇到无效参数时能够暂停运行并提供有用的诊断信息。 #### 四、assert_param的实际作用 1. **提高调试效率**...
4. **weiyu'.doc**:文档名称不太明确,但根据上下文推测,可能涵盖C++中的错误处理和调试技术,如assert宏、调试器的使用或异常处理机制。 5. **C++程序编译步骤详解.doc**:详细介绍了C++程序从源代码到可执行...
本文将重点介绍C++11中两种类型的断言:传统运行时断言(`assert`)和编译时断言(`static_assert`),并探讨它们的应用场景和优势。 #### 二、运行时断言:`assert` 在C++中,`assert`是一个宏,用于在程序运行时...
可以使用C++的assert宏进行断言测试,确保程序在关键点上的行为符合预期。 总的来说,基于C++的健身房管理系统涉及了C++的基本语法、面向对象编程、文件操作、内存管理、STL容器、设计模式以及错误处理等多个核心...
2. ** nullptr 和 assert**(C++11_in_Qt_2_nullptr_assert.pptx) - nullptr:取代了NULL,是一个明确的空指针常量,避免了与整型零混淆的问题。 - assert:在调试模式下,assert宏用于检查条件,帮助定位程序...
"C++98/C++03"章节可能专注于这两个早期版本的特定特性,如原始的异常处理机制、旧式的内存管理方式(new/delete)等。 "C++11/C++14/C++17/C++20"章节则会介绍新标准带来的变革,例如: - C++11:引进了auto类型...
C/C++支持异常处理机制,但使用不当可能会导致程序状态混乱。例如,不当的异常抛出或捕获可能会掩盖真正的错误源,使得调试变得复杂。 **解决方案**:遵循良好的异常处理实践,比如“资源获取即初始化”(RAII)模式...
CppUnit是JUnit的C++版本,然而由于C++语言与Java在特性上的差异(特别是C++缺少反射机制),CppUnit在C++中的应用并不理想。因此,googletest应运而生,它由Google开发,是专为C++设计的单元测试框架,它遵循NewBSD...
C++标准库并没有内置事件处理机制,但可以通过第三方库如SFML或SDL来实现。 8. **内存管理**:C++允许直接操作内存,因此需要小心处理对象的创建和销毁,避免内存泄漏。使用智能指针(如`std::unique_ptr`或`std::...
12. **静态_assert**:`static_assert`在编译时检查条件,提供更友好的错误信息,优于旧版的`#assert`。 13. **强类型枚举(Strongly-Typed Enums)**:C++11的枚举类(`enum class`)提供了类型安全,防止隐式类型...