C错误检测宏

   学习UNIX编程已经有小几个星期了,从开始的什么都不懂,现在终于有了点感觉。

   看的是《高级UNIX编程》和《UNIX网络编程》这两本书。其实我最开始是想看《UNIX网络编程》来学习网络编程的,可是看着看着发现没有UNIX系统编程的知识真的不行。还好从学校借来了《高级UNIX编程》这本书,就都穿插着看了看。

 

   UNIX下的系统调用或者C标准函数有很多都会返回错误,所以对错误的处理很关键。

   最原始的就是将函数放在一个if语句中判断,然后在分别处理;可是用这种方式,代码中会有很多的if的语句(这些语句并非代码的主要功能逻辑,而只是为了可能发生的错误),而导致可读性的极具下降,同时每次都敲那么多代码非常麻烦。

   上面的两本书都有各自的错误处理方式。《UNIX网络编程》使用的是它叫作包裹函数的机制。自己定义包裹函数,由包裹函数调用实际函数、检查返回值,并在发生错误时终止进程。书上有个例子是这样的:

   

在实际编程中再调用自己定义的包裹函数。用这样的方式,在编程中代码看起来会很简洁, 可是有个问题就是事先要定义巨大的包裹函数库,这是个长期积累的过程。

 

    再就是《高级UNIX编程》中对错误的处理是通过错误检测宏的机制。当我刚看到这个机制的时候,非常惊奇羡慕,只需要定义几个宏和几个函数,就可以应付几乎所有的错误检测,并且在代码中同样简介高效,可定制性也比之前的包裹函数要好。可是当我准备把那些宏抽取出来自己用的时候却发现了问题,那些函数的定义虽然不太复杂,可是却有调用其他地方的函数(貌似都是为了实现一个错误栈),调用得交错复杂的。如果想要照搬那些宏和函数要包含很多的头文件和定义,而且有些以我刚学的水平根本看不懂。

   还好我对错误检测的要求没有作者高,只需要能够检测和输出错误就行了,所以我对那些进行了大量的删减。将对错误栈的维护函数删除,改写了输出函数,基本上大的函数都被我删了。下面就是我删减的结果了:

ec.h:

函数实现,ec.c:

 

   这里需要说明的是,作者源程序中,对错误的输出是将errno的值和相应的错误表达字符串建立了一个一一对应的关系,然后通过errno的值来查找输出。如下为一个映射关系:

这样子处理麻烦而且,映射表的制作也很繁琐。刚好我前几天看到了可以通过:

的形式输出错误,很好用。虽然还没有仔细探查内部的工作形式,但是很好用,所以我觉得可以替代那个表了,毕竟简洁

 

在使用上,只需要将ec.h和ec.c添加入自己的项目中,就行了(书上强大的检测宏要添加很多文件)。当然使用方法和书上的一样。下面是个例子:

因为文件"abc"不存在,所以发生错误,输出:

 

  我是新手,如果有什么问题,请帮我指出来,谢谢;最后ec.c和ec.h的版权归属原书作者。

 

  欢迎转载,转载请著名出处

http://blog.csdn.net/zha_1525515/archive/2009/12/16/5019441.aspx

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值