调试帮助
assert预处理宏
assert是一种预处理宏。所谓预处理宏其实是一个预处理变量,它的行为类似于内联函数。assert预处理宏用一个表达式作为它的条件:
assert(expr);
若表达式expr为假,则assert输出信息并终止程序执行,如果表达式为真,则assert什么也不做。
assert宏定义在cassert头文件中,预处理名字由预处理器而非编译器管理,因此,我们可以直接使用预处理名字而无需提供using声明。
和预处理变量一样,宏名字在程序内必须唯一,含有cassert头文件的程序不能再定义名为assert的变量、函数或者其他实体。在实际编程时,即使没有保护cassert头文件,也最好不要使用assert作为标识符。
assert宏常用于检查“不能发生”的条件,例如:一个对输入文本进行操作的程序,可能要求所有给定的单词长度不能都大于某个阈值,此时可以采用:
assert(word.size()>threshhold);
NDEBUG预处理变量
assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做,默认情况下没有定义NDEBUG,此时assert将执行运行时检查。
关闭调试状态的方法:
#define NDEBUG
除了用于assert外,也可以使用NDEBUG编写自己的条件调试代码。如果NDEBUG未定义,将执行#ifndef和#endif之间的代码,如果定义了NDEBUG,这些代码将被忽略:
void print(cons tint ia[],size_t size)
{
#ifndef NDEBUG
cerr<<__func__<<“:array size is”<<size<<endl;
#endif
}
在上面的代码中使用__func__输出当前调试函数的名字,编译器为每个函数都定义了__func__,它是const char的一个静态数组,用于存放函数的名字。
其它用于程序调试有用的名字:
__FILE__ 存放文件名的字符串字面值。
__LINE__ 存放当前行号的整型字面值。
__TIME__ 存放文件编译时间的字符串字面值。
__DATE__ 存放文件编译日期的字符串字面值。

浙公网安备 33010602011771号