您的位置:首页 > 编程语言 > C语言/C++

错误检查--Thinking in C++

2015-03-13 09:56 281 查看

改进的错误检查

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

心连接什么。到目前为止, 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( )。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: