断言的使用
在C++中,宏assert()用来在调试阶段实现断言。程序运行时,首先计算assert()宏括号内表达式的值,若为假,则报告错误,若表达式为真,则继续执行后续内容。若想使用assert()宏,则需要包含头文件<cassert>。
接下来通过一个案例来说明如何通过断言完成程序检测,如例1所示。
例1
1 #include <iostream>
2 #include <cassert>
3
4 void *my_memcpy(void *dest, const void *src, int len)//编写memcpy函数
5 {
6 int i;
7 char *dest_cp;
8 const char *src_cp;
9
10 //内存数据拷贝时,要求目标地址和原始数据所在地址都不为nullptr
11 //若某个地址为nullptr则断言失败
12 assert(dest && src);
13
14 dest_cp = (char *)dest;
15 src_cp = (const char *)(src);
16 for (i = 0; i < len; i++) //按字节完成数据拷贝
17 *dest_cp++ = *src_cp++;
18
19 return dest_cp;
20 }
21 int main()
22 {
23 char *dest = nullptr; //设置dest的初值为nullptr
24 //调用my_memcpy()函数,首参数为nullptr
25 my_memcpy(dest, "Hello World!", 12);
26 return 0;
27 }
程序运行结果如图1所示。
图1 例1运行结果
例1中编写了my_memcpy()函数,该函数完成内存块数据的拷贝。拷贝时要求目标地址和原数据有效,因此使用断言宏assert()测试两个地址值,若某个地址为nullptr(0),则报错。指针dest值为nullptr,则程序在运行时报错,并给出提示,提示内容为发生错误所在的文件及行号。assert()断言失败后,一般会调用abort()函数终止程序。运行例7-9时,除了给出上面的提示外,还弹出了对话框,提示系统终止,如图2所示。
图2 程序终止提示
若想在程序中禁止使用断言,只需要在#include <cassert>之前添加#define NDEBUG即可,代码如下所示:
#define NDEBUG
#include <cassert>
在使用断言时,需要注意,断言应该在调试阶段使用,发布版本中一般不使用断言,另外assert()不应该对未初始化的数据提供初值,而且在断言表达式中一般不使用自增、自减运算符。