- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编码规范培训 设计功能单一的函数 如果pv为NULL,那么realloc的作用相当于调用malloc(size),并返回指向新分配内存块的指针,或者在该请求无法满足时返回NULL。 如果pv不是NULL,但新的块长为零,那么realloc的作用相当于调用free(pv)并且总是返回NULL。 如果pv为NULL且当前的内存块长为零,结果无定义 函数设计 设计功能单一的函数 这种设计的问题: 包含细节太多,不利于程序员的安全使用; 对入参没有限制,很难使函数防范无效的参数; 解决方法: 将多功能的函数分解为多个单一功能的函数 对于以上的realloc()函数可以分解为扩大内存块、缩小内存块、分配内存块和释放内存块四个函数;(对于每个函数,我们可以对入参进行严格的检查,而对于调用者也不会再发生使用的错误) 函数设计 设计功能单一的函数 函数接口设计要清晰易懂,没有异议 例子 下面的调用完成什么工作? UnsignedToStr(u, str, TRUE); UnsignedToStr(u, str, FALSE); 改写调用语句 #define BASE10 1 #define BASE16 0 ……… UnsignedToStr(u, str, BASE10); UnsignedToStr(u, str, BASE16); 修改后程序清晰明了 函数设计 设计功能单一的函数 根据前面编写单一功能函数处理,可以将此函数写为两个函数,如下 void UnsignedToDecStr(unsigned u, char* str); void UnsignedToHexStr(unsigned u, char* str); 为了增加函数的灵活性,可改写为 void UnsignedToStr(unsigned u, char* str, unsigned base); 两个问题: 增加函数灵活性和函数功能单一相矛盾 函数参数中最好不要使用布尔值,它不利于程序的扩展 编写注释突出可能的异常情况 函数设计 数据上溢 上溢 bool func(size_t cbSize) { if (cbSize 1024) { // we never deal with a string trailing null char *buf = new char[cbSize-1]; memset(buf,0,cbSize-1); // do stuff delete [] buf; return true; } else { return false; } } 代码是验证 cbSize 不大于 1 KB,并且 new 或 malloc 应该始终正确地分配 1 Kb内存。 new 或 malloc 的返回值应该在此时进行检查。 cbSize 不能为负数,因为它是 size_t。但是,如果 cbSize 是零,又会如何呢?查看一下分配缓冲区的代码,它从缓冲区大小请求中减去一。从零减去一会产生 size_t 变量,这是一个无符号的整数,其限制为 0xFFFFFFFF(假设为 32 位的值)或者 4 GB。 数据下溢 下溢 例子: void * memchr( void *pv, unsigned char ch, size_t size ) { unsigned char *pch = (unsigned char *) pv; while( -- size =0 ) (修改为while( size-- 0 ) ) { if( *pch == ch ) return (pch ); pch++; } return( NULL ); } 经常反问:“这个变量表达式会上溢或下溢吗?” 避免使用嵌套的“?:“运算符 unsigned uCycleCheckBox(unsigned uCur) { return( (uCur=1)?(1-uCur):(uCur==4)?2:(uCur+1) ); } 改写为: usigned uCycleCheckBox(unsigned uCur) { unsigned uRet; if(uCur = 1) { if(uCur != 0) /* 处理0,1,0 …… 循环 */ uRet = 0; else uRet = 1; } else { if(uCur == 4) /* 处
文档评论(0)