it returns no value.(如果expr为真,他会返回(void)0) * @retval None */ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ---------------------
define assert(exp) ((void)0)此时,assert(i>=0);不管括号中表达式为真还是为假,这一行代码其实相当于:NULL;意思是不执行任何操作。T这东西一般是用来记录系统日志什么的,调试辅助用的,判断表达式是否在正常范围里,不是的话进行日志记录,调用时一般会打印到控制台上或是日志文件里,方便调试...
expr 是要检查的表达式。 ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 是一个三元运算符表达式。如果 expr 为真(非零),则执行 (void)0(即什么也不做)。如果 expr 为假(零),则调用 assert_failed 函数,并传递当前文件名(使用 __FILE__ 宏)和行号(使用 __LINE__ ...
(void)0 : assert_failed((uint8_t *)__FILE__, __LINE__));这句话咋么理解。??? 答案 #define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__)) void assert_failed(u8* file, u32 line); 这句宏定义在STM32所有头文件里面都会出现,这是断言机制。
如果没定义USE_FULL_ASSERT,那么就会定义#define assert_param(expr) ((void)0),这是为什么呢,是因为用户在代码调试阶段很可能会输入错误的参数而出现错误,一般这种错误不会察觉到,所以当我们想检查这种错误的时候就定义USE_FULL_ASSERT,当我们完成工程项目开始投入生产以后,代码肯定是没有这方面的错误了,我们不需要...
出处 expr命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作。使用权限 所有使用者格式expr argument operator argument 参数说明 argument:为第一个参数 operator:为操作运算符 argument:为第二个参数
判定expr是不是0(或者空),如果不为0或空,返回0,;如果为0或空,那么调用assert_failed函数(应该是终止程序,并打印文件名和行号)__FILE__, __LINE__这两个宏是表示当前所在的文件名和行号 谢谢采纳
void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif 这是一个预编译文件,若是没有定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也...
void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif 这是一个预编译文件,若是定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也不执...
void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif 以上代码就是stm32f10x_conf.h中的一部分,我们再看下面的代码: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); ...