何为__weak? keil5中的修饰符
先看一个源码
/**
* @brief Rx Transfer completed callback.
* @param huart UART handle.
* @retval None
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file.
*/
}
这是串口接收完成函数的源码,该函数的作用就是什么也不做,
再看下面这个函数调用处:
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
/*Call registered Rx complete callback*/
huart->RxCpltCallback(huart);
#else
/*Call legacy weak Rx complete callback*/
HAL_UART_RxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
大概意思也很明确了,如果用户注册了回调函数,就用用户注册的,否则用默认的。注册的方式很简单,就是用户在外部定义新的HAL_UART_RxCpltCallback函数,然后HAL库内部有个规则将其赋给huart->RxCpltCallback,这样就完成了注册。而此时的HAL_UART_RxCpltCallback就是你在外部定义的,__weak定义的这个函数就会被忽略。
那么__weak的用处就是如此了。如果有一个__weak函数和一个不用__weak修饰的函数同时存在,编译器就会选择不用__weak修饰的函数,而忽略__weak修饰的函数。如果只有一个__weak函数存在,编译器就会选择__weak修饰的函数。