stm32h7 __attribute__((weak)) 使用說明

在用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;   }  

相關文章
相關標籤/搜索