#ifdef  USE_FULL_ASSERT
    #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
    void assert_failed(uint8_t* file, uint32_t line);
#else
    #define assert_param(expr) ((void)0U)
#endif

断言机制,本质是C语言中一个三目逻辑运算,宏定义的作用就是检查参数expr,判断参数expr是否为真,为真执行语句(void)0,为假就执行后面的函数assert_failed((uint8_t *)__FILE__,__LINE__),函数的作用在库函数中有解释,用来指示出错的行数和文件。

注意:

1、__FILE__,__LINE__是标准库函数中的宏定义;

2、#define为预处理指令,在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”,因此可以指出出错的行数与文件。

在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,快速地排除那些明显的错误,方便问题定位。

在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。

当你的项目开发成功,注释掉USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐