1234
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只在程序开发时使用,发布正式版本时会禁用。