关于assert_param的疑惑

来源:本站
导读:目前正在解读《关于assert_param的疑惑》的相关信息,《关于assert_param的疑惑》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于assert_param的疑惑》的详细说明。
简介:本文是关于assert_param的疑惑。

最近调试程序,发现ST的固件库中到处都是assert_param(),不清楚其编译结果,感觉这个“校参”过程很影响效率

在stm32f10x_conf.h中找到其源代码:

/* Exported macro ------------------------------------------------------------*/

#ifdef DEBUG

/*******************************************************************************

* Macro Name : assert_param

* Description : The assert_param macro is used for function's parameters check.

* It is used only if the library is compiled in DEBUG mode.

* Input : - 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.

* Return : None

*******************************************************************************/

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))

/* Exported functions ------------------------------------------------------- */

void assert_failed(u8* file, u32 line);

#else

#define assert_param(expr) ((void)0)

#endif /* DEBUG */

这里有这样的疑问:

1)这个“DEBUG”的宏在什么地方定义?编译器的OPTIONS?还是自己随便在哪定义,比如在main.c中?

2)((void)0)是什么意思,编译的结果是什么样的?

3)void assert_failed(u8* file, u32 line);这个函数应该是在外部定义吧?

网友回答:

这是一种常见的软件技术,可以在调试阶段利用编译器的检验功能,帮助程序员始终选择有效的参数。

所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在编译时报告错误,使程序员可以及时发现错误,而不必等到运行程序时,因为程序运行错误而大费周折。

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

当你的项目开发成功,使用release模式编译之后,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。

用户需要在main.c文件中实现assert_failed函数

#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t* file, uint32_t line)

{

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

/* Infinite loop */

while (1)

{

}

}

#endif

提醒:《关于assert_param的疑惑》最后刷新时间 2024-03-14 01:00:56,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于assert_param的疑惑》该内容的真实性请自行鉴别。