- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)