断言Assert
断言的用处就是入口参数过滤,参数可控。用法:
1定义枚举变量限定参数范围:
typedef enum{
参数1=x1,\
参数2=x2,\
............,\
参数n=Xn
}变量_typedef;
2 宏定义:
#define IS_函数名_ok(参数) (((参数)==参数1)||\
((参数)==参数2)||\
.............................
((参数)==参数n))
在"头文件.h"中定义以上内容,并做函数声明;然后在调用模块中包含该头文件并定义函数原型
3 void 函数名(变量_typedef 参数){
assert_param( IS_函数名_ok(参数)) ;
//函数体
}
4 全局中有以下宏定义
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
void assert_failed(u8* file, u32 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) */
/* Infinite loop */
while (1)
{
}
}
因此用断言进行入口参数检查按照以上的宏逐次被展开,如果入口参数在枚举变量中没有定义过就会报错。清晰明了。必须指出并非所有的函数都有如此,这些只对于那些重要的函数参数配置才用这个。比如波特率的选择等。