C语言学习笔记---断言函数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()的检测功能就自动失效了。这样在调试程序的时候,只需要一条语句就可以开启或者关闭调试信息输出了。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Python嵌入式软件接口测试Demo可以是用Python编写的一个演示程序,用于展示如何使用Python在嵌入式软件系统中进行接口测试。 该Demo程序可以具备以下功能: 1. 接口测试案例编写:演示如何使用Python编写接口测试案例,包括发送请求和解析响应等过程。可以使用Python的库或框架如`requests`、`unittest`等来简化接口测试的编写过程。 2. 自动化测试执行:演示如何使用Python编写测试脚本,自动化执行接口测试案例。可以使用Python的`unittest`或其他测试框架来批量执行测试用例,生成测试报告,验证接口的正确性。 3. 测试环境准备:演示如何使用Python来准备测试环境,例如模拟设备或信号等。可以使用Python的库如`pyserial`来模拟串口设备,`faker`来生成模拟数据等。 4. 数据库测试:演示如何使用Python来进行数据库接口测试。可以使用Python的ORM框架如`SQLAlchemy`来简化数据库的连接和操作,并编写相应的测试用例来验证数据库接口的正确性。 5. 异常处理和日志记录:演示如何使用Python来处理接口测试中可能出现的异常情况,并记录日志。可以使用Python的`logging`模块来管理和记录测试过程中的日志信息。 通过这个Demo程序,开发人员和测试人员可以更好地理解和学习如何使用Python来进行嵌入式软件的接口测试,提高测试效率和质量。同时,可以根据实际需求扩展Demo程序,添加更多的功能和测试场景。 ### 回答2: Python嵌入式软件接口测试Demo是一个用于测试嵌入式软件接口的演示程序。它使用Python编程语言来编写测试用例和执行测试,以检测嵌入式软件接口的功能和性能。 该Demo的主要特点包括: 1. 测试用例编写:使用Python的简洁语法和强大的库,可以轻松编写测试用例,包括发送测试数据和断言结果的逻辑。 2. 接口模拟:当嵌入式软件接口依赖于其他硬件设备或外部系统时,可以使用Python的模拟功能来模拟这些外部依赖,以便在没有实际硬件或外部系统的情况下进行接口测试。 3. 测试管理:可以使用Python的测试框架(如PyTest)来管理和执行测试用例,包括测试套件的组织和测试结果的报告生成。 4. 数据分析:使用Python的数据分析库(如Pandas)可以对测试结果进行统计和分析,以便更好地理解接口的性能和稳定性。 5. 集成和持续集成:由于Python具有良好的集成能力,该Demo可以很容易地与其他测试工具和持续集成系统进行集成,以实现自动化测试流程。 通过Python嵌入式软件接口测试Demo,我们可以快速开发和执行接口测试,验证嵌入式软件接口的正确性和稳定性,帮助开发团队及时发现和修复潜在的问题,提高软件质量和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值