assert预处理宏
assert是一种预处理宏,预处理宏就是一个预处理变量,它其实有点像内联函数,assert宏用一个表达式作为它的条件
assert(expr)
如果assert(expr为假)assert输出信息并终止程序的执行,如果expr为真则assert什么都不做
使用assert需包含cassert头文件
NEDBUG预处理变量
assert的行为依赖于一个名为NEDBUG的预处理变量的状态
如果定义了NEDBUG则assert什么也不做
可以用#define 语句定义NEDBUG从而关闭调试状态
也可以使用NDEBUG编写自己的条件调试代码,如果NDEBUG未定义,将执行#ifndef到#endif之间的代码,如果定义了NDEBUG,这些代码将被忽略
//如果未定义NDEBUG
#ifndef NDEBUG
cerr << "my name is" << __func__ << endl;
cerr << __FILE__ << endl;
cerr << __LINE__ << endl;
cerr << __TIME__ << endl;
cerr << __DATE__ << endl;
#endif
}
一些C++编译器定义的调试有用的名字:
_ func _ :一个静态数组,存放函数的名字
_ FILE _ :存放文件名的字符串字面值
_ LINE _ :存放当前行号的整形字面值
_ TIME _ :存放文件编译时间的字符串字面值
_ DATE _ :存放文件编译日期的字符串字面值
练习6.47:
#include<cassert>
#include<string>
#include<vector>
#include <iostream>
using namespace std;
void printVec(vector<int>& x) {
#ifndef NDEBUG
cerr << "vector size:" << x.size() << endl;
#endif
if (!x.empty()) {
auto temp = x.back();
x.pop_back();
printVec(x);
cout << temp << " ";
}
}
int main()
{
vector<int>x{ 1,2,3,4,5,6,7,8,9 };
printVec(x);
cout << endl;
system("pause");
return 0;
}
练习6.48:
不合理,只要有输入,则assert一直为真,无意义。最好用于检查不能发生的条件
string s;
while (cin >> s && s != sought) {
}
assert(cin)