编程之规范(二)

来源:互联网 发布:linux挂载emc磁盘阵列 编辑:程序博客网 时间:2024/06/05 10:43

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

现在再来考虑这样一种情况,有使用者这样调用库:MyMemMove(NULL,src, count),这是完全可能的,

因为一般来说这些地址都是程序计算出来的,那就难免会算错,出现零地址或者其它的非法地址也不足为奇。

可以预料的是,如果出现这种情况的话,则程序马上就会down掉,更糟糕的是你不知道错误出在哪里,于是

不得不投入大量的精力在浩瀚的代码中寻找bug。解决这类问题的通用办法是对输入参数作合法性检查

也就是V0.4版程序。

 

程序清单 5  V0.4版程序

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

{

    void *ret=dst;

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

    {

        return dst;

    }

    while (count--)

    {

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

        dst = (char *)dst + 1;

        src = (char *)src + 1;

     }

     return ret;

}

    上面之所以写成“if (NULL==dst||NULL ==src)”而不是写成“if (dst == NULL || src == NULL)”,也是为了降低犯错误的概率。我们知道,在C语言里面“==”和“=”都是合法的运算符,如果我们不小心写成了“if (dst = NULL || src = NULL)”还是可以编译通过,而意思却完全不一样了,但是如果写成“if (NULL=dst||NULL =src)”,则编译的时候就通不过了,所以我们要养成良好的程序设计习惯:常量与变量作条件判断时应该把常量写在前面