本文给出断言的两种实现方法,非原创,出处参考他处。
1. 利用结构体或数组的大小非负特性
/* Force a compilation error if condition is false, but also produce a result
* (of value 0 and type size_t), so it can be used e.g. in a structure
* initializer (or wherever else comma expressions aren't permitted). */
/* Linux calls these BUILD_BUG_ON_ZERO/_NULL, which is rather misleading. */
#define STATIC_ZERO_ASSERT(condition) (sizeof(struct { int:-!(condition); }) )
#define STATIC_NULL_ASSERT(condition) ((void *)STATIC_ZERO_ASSERT(condition) )
/* Force a compilation error if condition is false */
#define STATIC_ASSERT(condition) ((void)STATIC_ZERO_ASSERT(condition))
在上面#define中,struct {int:-!(condition);},当断言的条件为假时,!(condition)为真(>0),-!(condition)<0,因为结构体的位域大小不可能为负值,则在编译时会出错。
比如,我们要保证一个数k<65535,则
STATIC_ASSERT(k < 65535)
参考:http://blog.jobbole.com/16035/
2. 调用断言处理函数的方法
将下面的代码放到某个全局头文件中,其中声明了assert_failed函数,
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
extern void assert_failed(uint8_t* file, uint32_t line);
在.c文件中提供assert_failed的实现
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
printf("Wrong parameters value: file %s \
on line %d\r\n", file, line);
/* Infinite loop */
while (1)
{}
}
使用也非常简单,在assert_failed的while(1)死循环处设置断点,
代码中使用
assert_param(k < 65535);
当断言出错,则程序将停在死循环处,并在stdout打印出出错的文件及行数。
参考:TI的STM32F103库函数
分享到:
相关推荐
今天小编就为大家分享一篇python 实现selenium断言和验证的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Junit通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比较,对于void类型的方法,我们无法从它的return语句获得具体的返回值。...
主要介绍了Python selenium实现断言3种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
关于实现在SQL server中涉及多个表或聚集操作的比较复杂的完整性约束的方法 最近学习数据库系统概论,遇到了一个问题,查了好久没有解决,请教老师后才了解到在SQL server中要在触发 器中定义涉及多个表或聚集操作的...
重点研究了断言的动态检测方法与检测过程,并在关系数据库理论的基础上实现了交互式的断言动态检测工具,即TDDPA。该工具具有动态检测程序断言等功能,并通过将运行轨迹收集到数据库中来实现检测到的各种断言形式...
一个Test Case实例是一个测试用例,完整的测试流程包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run)、以及 测试后环境的还原(tearDown)。 (2)Test Suite Test Suite用来组装单个测试用例,可以...
今天小编就为大家分享一篇关于嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Respomse body:Contains string断言方法 (Respomse body:Contains string为包含断言,只要在结果中包含我们填写的字符,执行就是通过的) 1.选择Tests,在图片右下加选择Respomse body:Contains string的断言方法...
自定义扩展方法: 在用例中使用自定义方法(如:获取当前时间戳...)的返回值 接口录制:录制指定包含url的接口,生成用例数据 用例跳过:支持表达式、内置函数、调用变量实现条件跳过用例 动态多断言: 可(多个)动态...
在程序开发中测试和单元测试是两种不同的操作... nopCommerce程序单元测试定义实现是在Nunit框架的基础上进行定义实现的,断言操作是通过第3方法中间件FluentAssertions成员方法,而非Nunit框架的内置的断言成员方法。
Visible Assertions被设计用来代替标准的JUnit Assert类,从而提供了许多核心assert*方法的实现。 每个方法都带有一个附加参数,开发人员可以使用该参数来确切描述断言正在检查的内容。 关键区别在于,每个断言还...
assert, 在库和业务模型中,使用瘦断言库 assert 一个简单的php库,它包含在业务模型中输入验证( 不过滤)的断言和保护方法。 库可以用于在输入数据上实现 pre-/post条件。思想是减少在模型中实现断言的代码量,同时...
接口测试执行完后,我们需要进行断言,断言的主要目的是用代码来判断实际结果和预期结果是否一致,这跟手工测试中用肉眼去判断是一样的思路。既然这样,我们可以将已知的预期结果和未知的实际结果简单的封装成一个...
具体通过"断言"机制,每当trywarn()方法无法点开新的格子,就通过getasserts()方法生成"断言"。每个周围有未点开格子的格子生成一个"断言"。 每个"断言"携带该格子数字减去周围已预警雷数及周围未点开格子位置信息...
Webmozart断言 该库包含有效的断言,以测试方法的输入和输出。 使用这些断言,可以大大减少编写安全实现所需的编码量。 如果失败,则类中的所有断言都会引发\InvalidArgumentException 。常问问题什么区别? 该库受...
这里我所提到的是一种基于接口与其实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法,这些接口涉及到计算机领域的很多知识,其中包括数据结构,算法,字符串处理 和并发程序,这些实现并不...
重点研究了断言的动态检测方法与检测过程,并在关系数据库理论的基础上实现了交互式的断言动态检测工具,即TDDPA。该工具具有动态检测程序断言等功能,并通过将运行轨迹收集到数据库中来实现检测到的各种断言形式...