您现在的位置是:群英 > 开发技术 > 编程语言
C语言assert是什么函数,assert()怎样使用?
Admin发表于 2022-01-10 18:37:192292 次浏览

        这篇文章我们来了解C语言assert函数,下文详细的介绍了assert()的使用及需要注意的地方,对新手学习和理解assert()的使用有一定的参考价值,有需要的朋友可以了解看看,接下来就跟随小编来一起学习一下吧!

  在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数。如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错误信息,并调用abort()函数终止程序。

  下面通过一个简单的例子来看一下assert()的用法。

int main()
{
	int n = 1;
	assert(n>=0);
	printf("%d \r\n",n);
	system("pause");
	return 0;
}

  在assert()中表达式判断的条件是 n > 0 ,那么当整形变量n的值小于0时,就说明表达式为假,断言函数就会起作用。这里先试一下正常情况,将n的值设置为1,输出结果如下:


  接下来将 n 的值改为 -1,继续测试。


  此时程序异常终止了。下面详细分析一下,这个函数的执行过程。


  在assert.h头文件中可以查看到assert()的原型,这里有两个原型,一个是当定义了 _UNICODE 或者 UNICODE 时调用的是第一个assert(),当没有定义时,调用的是第二个assert()。由于在头文件中没有定义 _UNICODE 或 UNICODE,所以这里调用的是第二个assert。下面开始分析这条宏定义语句。

#define assert(_Expression) (void) 	((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  首先 assert 中传入了一个参数 _Expression ,接着还有有一条语句,里面有两部分由或运算符连接。对于或运算符 || 来说,当第一个条件成立时就不会执行第二个条件,只有当第一个条件不成立时才会执行第二条语句。

((!!(_Expression)) ||  (_assert(#_Expression,__FILE__,__LINE__),0))

  首先来看第一个判断条件 (!!(_Expression)),给传入的参数取了两次非,也就相当于变量本身,当 _Expression 为真时,就不会执行 第二个条件,只有 _Expression 为假时,才会执行第二个条件。在程序中当 n > 0 成立时就不会执行第二个条件,当 n > 0 不成立时,才会执行第二条语句,所以在上面测试中,当 n = -1 时,程序才会异常终止。

  接下来看第二个条件 (_assert(#_Expression,FILE,LINE),0) 这是一个函数,它的原型是:

void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);

  这个函数有三个参数,根据这三个参数的名称大概可以推断出,第一个参数是用来存储信息内容,第二个参数是用来表示当前文件的详细信息,第三个参数表示代码中那一行出错。

  这三个参数和控制台打印的内容相符合,Program 后面跟着的是当前运行的可执行文件路径,File 后面跟着的是报错的文件路径,Line 后面跟着的是 出错的具体位置,说明在 test6.c 文件中第16行程序出现了错误,最后一行提示出错的表达式 为 n>=0 ,说明变量n 大于等于0这个条件不成立,也就是当前变量n的值小于0,所以引发了程序异常。

  通过上面的分析可以看出,assert()对应调试程序来说很有帮助,像这种隐藏在代码中的错误在编译程序的时候,编译器是检测不出来的,只有当程序执行的时候才会发现。所以通过assert()来检测表达式就可以快速的定位程序的bug。

  加入不想使用assert()来检测了,不需要修改代码,只需要在assert.h中定义 NDEBUG就行了。

 在assert.h中添加宏定义,继续运行程序。


  此时n的值为-1,但是程序正常的打印出了-1,并没有报错。说明assert()不检测错误了。这个从头文件中也可以看出。


  当定义了NDEBUG之后,**assert(_Expression)**执行的具体函数就变成了 ((void)0),也就是啥也不干了。所以当在头文件中定义了NDEBUG之后,assert()的检测功能就自动失效了。这样在调试程序的时候,只需要一条语句就可以开启或者关闭调试信息输出了。

    关于C语言assert函数及其使用就介绍到这,上述示例具有一定的借鉴价值,对大家学习assert函数有一定的帮助,感兴趣的朋友可以参考。最后,想要了解更多c语言的内容,大家可以关注其它的相关文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: c语言assert
相关信息推荐
2022-11-11 17:47:03 
摘要:C语言中字符串的结束标志是【'\0'】。C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,字符串总是以【'\0'】作为结束符。
2022-01-04 18:54:28 
摘要:这篇文章给大家分享的是C语言内存函数的作用和用法,这里主要介绍几个常见的内存函数,有memcpy、memcmp、memmove和memset,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
2022-05-14 15:02:08 
摘要:html5教程:本文为大家分享了利用html5实现简单的时钟效果的代码,包含了fillText、drawhand等重点知识,具有一定的参考价值,希望能对大家有所帮助。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部