assert_param(expr) ((void)0U)

在IAR工作环境中,用的stm32f4建的工程。其中碰到了assert_param(expr) ((void)0U),这样一句话。于是开始搜索。。。。。

assert是C++开发过程中经常用到的一个宏。在debug模式下,它起到断言的作用;在release模式下,它产生空语句并被编译器优化掉

来看一下具体的定义。

#ifdef  USE_FULL_ASSERT
/**
  * @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)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
  void assert_failed(uint8_t* file, uint32_t line);
#else
  #define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */

如果在debug模式下如果出现错误就会跳到某个文件某一行,对于处理错误相当好。如果在release模式下,这句话就相当于NULL直接跳过。

((void)0)

在宏定义中,为了宏展开的安全,通常使用括号将表达式括起来,所以我们真正需要关注的是(void)0。从形式上,它很类似于强制类型转换

(void)0表示将0强制转换为void。所以(void)0的涵义就是将表达式0显示地转换为void类型。转换前后的区别在于:转换之前,表达式0的值为int类型0;而转换之后,表达式(void)0的值为void


 在程序中你就当做空语句就行了。。。。。。

Tags:
1,704 Comments