调试时的Assert用法

来源:互联网 发布:apache windows 32位 编辑:程序博客网 时间:2024/06/05 20:55

Assert断言类似于头文件保护技术,在调试代码时有重要的作用。基本思想C++ Primer:程序可以 包含一些用于调试的代码,但是这些代码只在开发程序时使用。但应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。

assert预处理宏(头文件cassert)

表达式:assert(expr),如果expr为假(即0),assert输出信息并终止程序的执行。如果表达式为真(即非0),assert什么 也不做。

#include "stdafx.h"#include <cassert>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int a=5;assert(a>4);a=3;assert(a>4);system("pause");return 0;}
结果如图:



NDEBUG预处理变量

assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态没有定义NDEBUG,此时assert将执行运行时的检测。使用#define NDEBUG来关闭调试状态,这个宏定义需要在#include<cassert>之前。定义NDEBUG能避免检测各种条件所需的运行时开销,因为当前并不执行断言assert。

#include "stdafx.h"#define NDEBUG#include <cassert>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int a=5;assert(a>4);a=3;assert(a>4);system("pause");return 0;}
结果:


需要注意的是:

1. 使用断言尽量只检测一个条件,多个条件一起检测时无法知道是哪条语句出错。

2. 不要在断言assert中执行改变环境变量的语句,如assert(i++>5),因为断言assert只在程序开发时使用,发布正式版本时会禁用。










0 0