断言语句用于程序调试阶段,测试数据是否正常,调试完毕后,注释掉宏定义,以提高程序运行速度
#define USE_FULL_ASSERT 1
ifdef USE_FULL_ASSERT
#define EFM_ASSERT(expr) ((expr) ? ((void)0) : assertEFM(__FILE__, __LINE__))
//assert_param(expr),断言函数,判定expr是不是0(或者空),如果为非0或空,执行语句(void)0,这是一个相当于空语句的表达式,不对程序产生任何影响。如果是0或空,那么调用assert_failed函数(终止程序,并打印文件名和行号)。
//编译器内置宏: FILE, LINE,绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。编译器在进行源码编译的时候,会自动将这些宏替换为相应内容。
ANSI C标准中有几个标准预定义宏(也是常用的)
LINE:在源代码中插入当前源代码行号
FILE:在源文件中插入当前源文件名
DATE:在源文件中插入当前的编译日期
TIME:在源文件中插入当前编译时间
STDC:当要求程序严格遵循ANSIC标准时该标识被赋值为1
void assertEFM(uint8_t* file, uint32_t line); //打印输出文件名和行号
else
#define EFM_ASSERT(expr) ((void)0) //运行空命令行
endif
调试程序时宏定义好USE_FULL_ASSERT时,系统运行函数EFM_ASSERT(expr) 时会自动运行命令EFM_ASSERT(expr) ((expr) ? ((void)0) : assertEFM(__FILE__, __LINE__)) 如果检测到expr为非真则运行,assertEFM(__FILE__, __LINE__))输出文件名和行号
调试程序时若没有宏定义USE_FULL_ASSERT,系统运行函数EFM_ASSERT(expr) ((void)0),运行了一句空命令行