在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 请看下面的程序清单badptr.c: int main( void ) return 0; [root@localhost error_process]# gcc badptr.c 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 用法总结与注意事项: int resetBufferSize(int nNewSize) ... 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 好: assert(nOffset >= 0);
5)有的地方,assert不能代替条件过滤 文章出处:http://www.diybl.com/course/3_program/c++/cppjs/20071111/85534.html 摘自《高质量C/C++编程指南》Page 41-42... 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。 void *memcpy(void *pvTo, const void *pvFrom, size_t size) assert 不是一个仓促拼凑起来的宏。为了不在程序的Debug 版本和Release 版本引起差别,assert 不应该产生任何副作用。所以assert 不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在 assert 处终止了,并不是说含有该assert 的函数有错误,而是调用者出了差错,assert 可以帮助我们找到发生错误的原因。 很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么?树要倒?有废井?有野兽?除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。 【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 ASSERT宏中应该包含的元素: 判断条件;输出当前断言失败的位置(文件、行数等);返回错误;终止程序... 几种典型的ASSERT的写法: VC中的写法: #define ASSERT(f) \ #define _ASSERT(expr) \ 其他平台的写法: # define ASSERT(x) ((x) || (dbg_printf("assertion failed ("__FILE__":%d): \"%s\"\n",__LINE__,#x), break_point(), FALSE)) 原网站地址:http://hi.baidu.com/uwbadnhctpkopwr/item/1d5d1e1d316c79fcdceeca0a |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论