- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
assert() 函数用法
assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行.? 原型定义:?
显示代码
打印
1 #include assert.h 2 void?assert(?int?expression ); assert的作用是现计算表达式?expression?,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用?abort?来终止程序运行。? ? 请看下面的程序清单badptr.c:?
显示代码
打印
01 #include 02 #include
03 #include 04 int?main(?void?)
05 { 06 ?FILE?*fp;
07 ?? 08 ?fp =?fopen(?test.txt,?w?);//以可写方式打开一个文件,如果不存在就创建一个同名文件
09 ?assert( fp );?//所以这里不会出错 10 ?fclose( fp );
11 ?? 12 ?fp =?fopen(noexitfile.txt,?r?);//以只读方式打开一个文件,如果不存在就打开文件失败
13 ?assert( fp );?//所以这里出错 14 ?fclose( fp );?//程序永远都执行不到这里来
15 ?? 16 ?return?0;
17 } ? 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。? 在调试结束后,可以通过在包含#include?的语句之前插入?#define?NDEBUG?来禁用assert调用,示例代码如下:?
显示代码
打印
1 #include 2 #define NDEBUG
3 #include ? 用法总结与注意事项:? 1)在函数开始处检验传入参数的合法性? 如:? ?
显示代码
打印
01 int?resetBufferSize(int?nNewSize) 02 {
03 //功能:改变缓冲区大小, 04 //参数:nNewSize 缓冲区新长度
05 //返回值:缓冲区当前长度 06 //说明:保持原信息内容不变 nNewSize=0表示清除缓冲区
07 assert(nNewSize = 0); 08 assert(nNewSize = MAX_BUFFER_SIZE);
09 ?? 10 ...
11 } ? 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败? ? 不好:?assert(nOffset=0??nOffset+nSize=m_nInfomationSize);? ? 好:?assert(nOffset?=?0);? assert(nOffset+nSize?=?m_nInfomationSize);? ? ? 3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题? 错误:?assert(i++??100)? 这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。? 正确:?assert(i??100)? ?i++;? ? 4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感? ? 5)有的地方,assert不能代替条件过滤? ? #C++? ? 程序一般分为Debug?版本和Release?版本,Debug?版本用于内部调试,Release?版本发行给用户使用。断言assert?是仅在Debug?版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert?的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。?
显示代码
打印
01 //复制不重叠的内存块 02 void?memcpy(void?*pvTo,?void?*pvFrom,?size_t?size)
03 { 04 void?*pbTo = (byte *) pvTo;
05 void?*pbFrom = (byte *) pvFrom; 06 assert( pvTo != NULL pvFrom != NULL );
07 while(size - - 0 ) 08 *pbTo + + = *pbFrom + + ;
09 return?(pvTo); 10 }
文档评论(0)