您的位置:首页 > 其它

使用预处理器进行调试

2011-11-13 15:40 246 查看
可以使用预处理变量来避免重复包含头文件。同样可以使用类似的技术有条件的执行用于调试的代码:程序所包含的调试代码仅在开发过程中执行。当应用程序已经完成,并且准备提交时,就会将调试关闭。可使用NDEBUG预处理变量实现有条件的调试代码:

int main() {

#ifndef NDEBUG

cerr << "starting main" << endl;

#endif

//…

如 果NDEBUG未定义,那么程序会将信息写到cerr中。默认情况下,NDEBUG未定义。在开发程序过程中,只要保持其未定义,则会执行其中的调试语 句。开发完成后,要将程序交付给客户时,可通过定义NDEBUG预处理变量,(有效的)删除这些调试语句:$ CC -DNDEBUG main.C

这样的命令行等效于在main.c的开头提供了#define NDEBUG预处理命令。

预处理器还定义了四种在调试时非常有用的常量:

_ _FILE_ _ 文件名

_ _LINE_ _ 当前行号

_ _TIME_ _ 文件被编译的时间

_ _DATE_ _ 文件被编译的日期

if (word.size() < treshold)

cerr << "Error: " << _ _FILE_ _

<< " : line " <<_ _LINE_ _ << endl;

<< "Compliled on " << _ _DATE_ _

<< " at " << _ _TIME_ _ << endl

<< " Word read was " << word

<< " : Length too short" << endl;

2. 另一个常见的调试技术是使用NDEBUG预处理变量以及assert预处理宏。assert是在cassert头文件中定义的,所有使用assert的文件都必须包含这个头文件。

预 异常不同(异常用于处理程序执行时预期要发生的错误),程序员使用assert来测试“不可能发生”的条件。例如,对于处理输入文本的程序,可以预测全部 给出的单词都比指定的阈值长。那么程序可以包含这样一个语句:assert(word.size() > threshold);

Assert在成品代码中,不做任何工作,因此也没 有任务运行时代价。当然 ,也不会引起任何运行时检查。

转至:《C++ Rrimer中文 版》ISBN:978-7-115-14554-3/TP
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: