错误检查--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( )。
相关文章推荐
- 品味Thinking In C++(二)
- 重读Thinking In C++
- Thinking in C++ 下载
- Thinking in C++ learning(3)-----隐藏实现
- Thinking in C++ learning(2)-----Data Abstract
- thinking in c++ 卷2
- thinking in c++ 读书笔记---友元函数的一个问题
- Thinking in C++读书笔记--5.3缺省参数
- Thinking in C++(1)
- thinking in c++ 读书笔记:c与c++之区别
- Thinking in C++ 阅读笔记(第三章)
- Thinking in C++ (1-2)
- Thinking in C++ (1-1)
- Thinking in C++读书笔记--7.2指针常量
- Thinking in C++ (1-5)
- 终于看完《Thinking in c++》第二版的第一卷了
- Thinking in C++ 第二版 简体中文版 前言
- Thinking in C++ 阅读笔记(第一章)
- Thinking in C++ learning(1)-----C in C++
- thinking in c++ 读书笔记---集合初始化