错误检查--Thinking in C++

改进的错误检查

为本书其余部分改进错误检查是很方便的。用内联函数可以简单地包括一个文件而不用担

心连接什么。到目前为止, assert( )宏已用于“错误检查”,但它真正用处是调试并终将被能够

在运行时提供更多有用信息的东西代替。何况异常处理程序(在 1 7章介绍)已提供了更多的处

理这些错误的有效的方法。

这是预处理器仍然有用的另一个例子,因为 _ F I L E _和 _ L I N E _指示仅和预处理器一起起作

用并用在 assert( )宏里。假如 assert( )宏在一个错误函数里被调用,它仅打印出错函数的行号和

文件名字而不是调用错误函数。这儿显示了使用宏联接(许多是 assert( ) 方法)函数的方法,

紧接着调用 assert( )(程序调试成功后这由一个 #define NDEBUG消除)。

下面的头文件将放在书的根目录中,所以它可以从所有的章节里得到。 “ A l l e g e”是 a s s e r t

<span style="font-size:14px;">//: ALLEGE.H -- Error checking
#ifndef ALLEGE_H_
#define ALLEGE_H_
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

inline void
allege_error(int val, const char * msg) {
	if(!val) {
		fprintf(stderr, "error: %s\n", msg);
#ifdef NDEBUG
	exit(1);
#endif
	}
}

#define allege(expr, msg) \
{ allege_error((expr) ? 1 : 0, msg); \
  assert(expr); }


#define allegemem(expr) \
   allege(expr, "out of memory")

#define allegefile(expr) \
    allege(expr, "could not open file")
#endif // ALLEGE_H_
</span>



函数allege_error( )有两个参数:一个是整型表达式的值,另一个是这个值为 f a l s e时需打印
的消息。函数 fprintf( )代替 i o s t r e a m s是因为在只有少量错误的情况下,它工作得更好。假如这
不是为调试建立的, e x i t ( 1 )被调用以终止程序。
allege( )宏使用三重 i f - t h e n - e l s e强迫计算表达式 e x p r求值。在宏里调用了 allege_error( ),接
着是 assert( ) ,所以我们能在调试时获得 assert( )的好处——因为有些环境紧密地把调试器和
assert( )结合在一起。
allegefile( )宏和 allegemen( )宏分别是 allege( )宏用于检查文件和内存的专用版本。这个代
码提供了出错报告的必要的最少信息,但我们可以在这个框架基础上增加它。
下面是测试A L L E G E . H简单例子。

<span style="font-size:14px;">//: ERRTEST.CPP -- Testing the allege() macro
// #define NDEBUG // turn off asserts
#include "../allege.h"
#include <fstream.h>

main() {
    int i = 1;
    allege(i, "value must be nonzero");
    void* m = malloc(100);
    allegemem(m);
    ifstream nofile("nofile.xxx");
    allegefile(nofile);
}
</span>


去掉下面这行的注释符后,我们就知道这个程序是如何变为成品的:
//#define NDEBUG // turn off asserts
对于本书其余部分,将一律用 allege( )宏代替 assert( ),只有个别只须在调试时检查而运行
时不需的情况才用 assert( )。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZenZenZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值