编程之规范(三)

来源:互联网 发布:linux编辑文件命令vim 编辑:程序博客网 时间:2024/06/05 08:18

转自: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)时,显示错误

     

 

原创粉丝点击