学科分类
目录
C++基础

断言的使用

在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()不应该对未初始化的数据提供初值,而且在断言表达式中一般不使用自增、自减运算符。

点击此处
隐藏目录