断言宏Assert.pdf

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
断言宏Assert

断言宏ASSERT 断言宏ASSERT 断断言言宏宏AASSSSEERRTT assert 语法: #include assert.h voidassert( int exp); 功能: 宏assert()用于错误检测。如果表达式的结果为零,宏写错误信息到STDERR并退出程序执行。 如果宏NDEBUG已经定义,宏assert()将被忽略。 assert在PC机上编程上被广泛只用,当断言失败时会在界面上弹出警告对话框,现象清晰明显,编程人 员很容易发现自己的程序出了问题,并加以改正。在这里必须清晰的知道一点,调试生效的事实告诉我们 的是assert的一个重要作用是帮助开发者调试程序定位错误的。作为开发者一个普遍事实是解决bug并 不难,定位bug往往是最难的。这也是我倡导多使用assert的原因所在。再深想一层,我们作一个假想: 假如assert在发布版上也能用,那么什么时候用assert,什么时候用提示对话框,原则是什么?我认为 这里有一个用户层次的问题。程序其实一般有两类用户:未发布前的开发者和发布后的用户。作为开发者, 我们假定他是懂断言的,但对于用户,我们却不能假定他懂断言。如果这个接口是面对开发者的,那么就 应该用断言来限制输入参数;如果是面向用户的,那么就应用提示对话框,比如弹出一个对话框选择让用 户选择一个输入文件,但用户还没选择文件就按确定按钮,这应该用对话框就是提示,而不应该断言(这 里如果弹出断言对话框,他还不知道是怎么回事呢)。 以下情况不适合用assert: Example: void *malloc( size_t size ); malloc函数用来在堆中动态分配一段内存 ,并返回地址,如果分配失败则返回NULL;如果返回结果为 NULL,就不应用assert,我们应该以警告对话框的方式向用户提示,因为这种错误很难在调试过程中出 现。 以下情况适合用assert: 当我们在和他人合作的过程中,常常需要写一些子函数供别人使用,我们自身当然很清楚函数参数的意义, 和取值要求,但使用者不一定清楚。如果我们在函数入口处用一个 assert对参数进行检测,就能让错误 尽早暴露。并且在NDEBUG模式下assert失效,不会影响程序效率。 assert在单片机程序中的使用 assert在单片机程序中的使用 aasssseerrtt在在单单片片机机程程序序中中的的使使用用 在单片机程序中如果我们直接使用assert通常看不到明显现象,因此我们要自己来写assert使其 现象明显便于尽快定位到程序中的错误。下面给出一个典型的ASSERT定义 #ifdef AF_DEBUG void_assert(const char*,const char*,unsigned); #define ASSERT(X) do{\ if(!(X)){\ _assert(#X,__FILE__,__LINE__);\ }}while(FALSE) #else #define ASSERT(X) #endif //AF_DEBUG 调试模式下,也就是当定义了AF_DEBUG时ASSERT生效,当断言失败时执行_assert函数,并 将断言信息,当前文件名,当前行号作为参数传入,这里只给出_assert的原型,具体实现需要使用者自 己提供。下面给出我的一个_assert的例子: void_assert(const char * szErrAssert,const char*szFile,unsigned nLine) { //输出断言信息 //输出文件名 //输出行号 while(TRUE); //程序进入死循环 } 以上函数实现在液晶上显示断言信息,当前文件名,当前行号,其中的一些驱动函数需要自己实现, 主函数中写上 ASSERT(5 10);(这里只是举个例子,并无实际意义),运行结果如下: 除了使用液晶显示,我们还可以将错误信息从串口输出,或者通过LED闪烁,数码管等方式将断言 失败信息反应出来,便于及时处理。

文档评论(0)

shaofang00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档