10.14 调试帮助¶
调试变量¶
预处理器定义了5个对于程序调试很有用的名字:
| 名字 | 含义 |
|---|---|
__func__ |
函数名字的字符串字面值 |
__FILE__ |
文件名的字符串字面值 |
__LINE__ |
当前行号的整型字面值 |
__TIME__ |
文件编译时间的字符串字面值 |
__DATE__ |
文件编译日期的字符串字面值 |
assert预处理宏¶
assert定义在cassert头文件中,它会对括号内的表达式求值,如果表达式为假(即0),assert输出信息并终止程序的执行:
// 用于检查在运行时"不能发生"的情况, 如果出现则终止程序
assert(expr);
NDEBUG预处理变量¶
assert的行为依赖于一个名为NDEBUG的预处理变量,如果定义了NDEBUG,那么assert就什么都不做。默认情况下没有定义NDEBUG,此时assert将执行运行时检查,我们可以通过命令行选项定义NDEBUG,从而关闭调试状态:
# 等价于在main.cpp文件的一开始写#define NDEBUG
$ g++ -D NDEBUG main.cpp
除了控制assert的行为外,我们也可以使用NDEBUG编写自己的条件调试代码:
// 如果定义了NDEBUG, 那么忽略#ifndef和#endif之间的代码
void print(const int ia[], size_t size) {
#ifndef NDEBUG
cerr << __func__ << ": array size is " << size << endl;
#endif
}