调试帮助

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__   存放文件编译日期的字符串字面值。

posted @ 2018-05-02 15:00  刘-皇叔  阅读(339)  评论(0)    收藏  举报