在用stm32h7 板子的時候,看了一個usmart歷程,裏面有個usart.c函數,聲明瞭一個函數叫作HAL_UART_RxCpltCallback(UART_HandleTYpeDef *huart)函數
而後再stm32h7xx_hal_uart.c裏看到了一樣的一個函數spa
__weak void HAL_UART_RxCpltCallback(UART_HandleTYpeDef *huart)變量
{引用
}程序
而後看了下__weak的定義:#define __weak __attribute__((weak))co
場景:
A,B兩個模塊,A模塊調用了不肯定B模塊是否提供了函數,可是又不得不調用,這個時候在A模塊中再申明一個弱符號函數,即用weak,若是外部提供了調用外部的,若是沒提供調用申明的。錯誤
弱符號:
若兩個或兩個以上全局符號(函數或變量名)名字同樣,而其中之一聲明爲weak屬性,則這些全局符號不會引起重定義錯誤。連接器會忽略弱符號,去使用普通的全局符號來解析全部對這些符號的引用,但當普通的全局符號不可用時,連接器會使用弱符號。當有函數或變量名可能被用戶覆蓋時,該函數或變量名能夠聲明爲一個弱符號。return
示例:
//模塊A中調用func,可是不肯定外部是否提供了該函數
...
extern int func(void);
...
int a = func();
...
若是直接這麼調用,若是外部不提供該函數程序可能出現crash。void
因此在本模塊中__attribute__((weak))就派上了用場
int __attribute__((weak)) func(......) { return 0; }