C++ primer 6.5.3调试帮助

本文介绍了C++中的assert预处理宏及其与NDEBUG变量的关系,展示了如何利用assert进行条件性错误检查,并通过例子演示了如何在调试和生产环境中切换。同时,讲解了常用的调试符号如_func_、_FILE_等及其用法。
摘要由CSDN通过智能技术生成

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值