使用预处理器进行调试(调试常量命令,文件名、行号、编译时间、日期)

可以使用预处理变量来避免重复包含头文件。同样可以使用类似的技术有条件的执行用于调试的代码:程序所包含的调试代码仅在开发过程中执行。当应用程序已经完成,并且准备提交时,就会将调试关闭。可使用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等效于检验数据是否总是具有预期大小。一旦开发和测试工作完成,程序就已经建立好,并且定义了NDEBUG。在成品代码中,assert语句不作任何工作,因此没有任何运行时代价。当然,也不会引起任何运行时检查。assert仅用于检查确实不可能的条件,这只对程序的调试有帮助,但不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测


《C++ Primer4》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值