断言函数的用法


断言语句用于程序调试阶段,测试数据是否正常,调试完毕后,注释掉宏定义,以提高程序运行速度

#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 assert_failed(uint8_t* file, uint32_t line); //打印输出文件名和行号
else
  #define assert_param(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,系统运行函数assert_param(expr) ((void)0),运行了一句空命令行

猜你喜欢

转载自www.cnblogs.com/qingyunboke/p/10062125.html