编程之规范(三)

转自:http://blog.sina.com.cn/s/blog_5e8facd20100eorv.html

V0.4版的代码首先对参数进行合法性检查,如果不合法就直接返回,这样虽然程序dwon掉的可能性降低了,但是性能却大打折扣了,因为每次调用都会进行一次判断,特别是频繁的调用和性能要求比较高的场合,它在性能上的损失就不可小觑。

    如果通过长期的严格测试,能够保证使用者不会使用零地址作为参数调用MyMemMove函数,则希望有简单的方法关掉参数合法性检查。我们知道宏就有这种开关的作用,所以V0.5版程序也就出来了。

 

程序清单 6  V0.5版程序

void * MyMemMove(void *dst,const void *src,int count)

{

     void *ret=dst;

#ifdef DEBUG

    if (NULL==dst||NULL ==src)

    {

         return dst;

    }

#endif

    while (count--)

    {

          *(char *)dst = *(char *)src;

          dst = (char *)dst + 1;

          src = (char *)src + 1;

     }

     return ret;

}

    如果在调试时我们加入“#define DEBUG”语句,增强程序的健壮性,那么在调试通过后我们再改为“#undef DEBUG”语句,提高程序的性能。事实上在标准库里已经存在类似功能的宏:assert,而且更加好用,它还可以在定义DEBUG时指出代码在那一行检查失败,而在没有定义DEBUG时完全可以把它当作不存在。assert(_expression_r_r)的使用非常简单,当_expression_r_r为0时,调试器就可以出现一个调试错误,有了这个好东西代码就容易多了。

 

程序清单 7  V0.6版程序

void * MyMemMove(void *dst,const void *src,int count)

{

    assert(dst);

    assert(src);

    void *ret=dst;

    while (count--)

    {

        *(char *)dst = *(char *)src;

        dst = (char *)dst + 1;

        src = (char *)src + 1;

     }

     return ret;

}

    一旦调用者的两个指针参数其中一个为零,就会出现如图1所示的错误,而且指示了哪一行非常容易查错。

 

         

                           图 1  assert(NULL)时,显示错误

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值