C/C++ 断言(assert)的用法

目录

  • assert() / 断言
    • 1. assert()原型
    • 2. assert()的开启和关闭
    • 3. 一般在什么情况下使用assert()?
    • 4. 使用assert()应该养成的良好习惯


assert() / 断言


1. assert()原型

#include "assert.h" 
void assert( int expression );

assert() 是个宏。

assert() 是一个调试程序时经常使用的宏。

写代码的时候熟练的使用assert,可以给自己的代码调试带来极大的便利。

其作用是先计算表达式 expression ;

  1. 如果expression的值为false(0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。
  2. 如果expression的值为true,则继续执行后面的语句。

这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。


2. assert()的开启和关闭

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。

使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销;所以assert()只有在 Debug 版本中才有效,如果编译为 Release 版本则应该被忽略。

那么 assert()宏 如何屏蔽或启用?

在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:

#include 
#define NDEBUG 
#include

3. 一般在什么情况下使用assert()?

类型检查
单元测试
确定各种特性是否在程序中得到维护

1.可以在预计正常情况下程序不会到达的地方放置断言。(如assert (0);)
2.使用断言测试方法执行的前置条件和后置条件 。
3.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如某个变量的变化范围)

前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性


4. 使用assert()应该养成的良好习惯

当然在使用的断言的过程中会有一些我们应该注意的事项和养成一些良好的习惯,如:
1.每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
2.不能使用改变环境的语句,因为assert只需要在DEBUG阶段生效,如果这么做,会使用程序在真正运行时遇到问题
3.assert和后面的语句之间应空一行,让代码风格更清晰明朗
4.有的地方,assert不能代替条件过滤
5.在函数开始处检验传入参数的合法性
6.断言语句不可以有任何边界效应


你可能感兴趣的:(C,/,C++)