读《微软C编程精粹》的一些收获

-  要使用断言对函数参数进行确认
-  为了不必要的开销,可以仅使用断言,而不要return
    网上有人写的strcpy代码,做了太多的出错处理,导致性能低下,其实没必要,用assert就行了,这样在debug模式下能捕捉错误,release下又不影响性能。

- 书上提供的memcpy的范例

void memcpy(void* pvTo, void* pvFrom, size_t size)
{
 void* pbTo = (byte*)pvTo;
 void* pbFrom = (byte*)pvFrom;
 ASSERT(pvTo != NULL && pvFrom != NULL);
 /* 内存块重叠吗?如果重叠,就使用memmove */
 ASSERT(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
 while(size-->0)
  *pbTo++ == *pbFrom++;
 return(pvTo);
}

 

- 不使用ASSERT的危害

这个小组的代码与Word代码之间一个明显的区别是Word代码从过去到现在一直都使用断言和调试代码,而他们的代码却几乎没有使用断言。因此,其程序员没有什么好的办法可以确定其代码中的实际错误情况,错误只能慢慢地暴露出来。如果他们在代码中使用了断言,这些错误本该在几个月之前就被检查出来。

同样,xeyez由于没有使用Debug版,导致了很多的内存错误在客户的电脑上暴漏了出来。

 

- 一个错误的使用ASSERT的例子

char* strdup(char* str)
{
 char* strNew;
 ASSERT(str != NULL);
 strNew = (char*)malloc(strlen(str)+1);
 ASSERT(strNew != NULL);  // 这里使用错误
 strcpy(strNew, str);
 return(strNew);
}
第一个断言的用法是正确的,因为它被用来检查在该程序正常工作时绝不应该发生的非法情况。第二个断言的用法相当不同,它所测试的是错误情况,是在其最终产品中肯定会出现并且必须对其进行处理的错误情况。


虽然这一程序更精确地反应了相应的算法,但有经验的程序员很少会这样编码。否则好机会就来了,我们可以把他们塞进一辆既没有安全带又没有车门的双人Cessna车中。上面的程序使人感到太危险了。

在该函数的交付版本中,相应的防错措施可以保证当出了毛病时,用户可以不受损失;而在该函数的调试版本中,错误仍然可以被报告出来。

你可能感兴趣的:(编程,c,算法,null,byte,微软)