__attribute__((weak)) 簡介及作用
阿新 • • 發佈:2018-11-04
最新在看專案新架構程式碼上看到了有使用到weak,以前沒有看到過,所以寫一篇文章以作記錄。
場景:
A,B兩個模組,A模組呼叫了不確定B模組是否提供了函式,但是又不得不呼叫,這個時候在A模組中再申明一個弱符號函式,即用weak,如果外部提供了呼叫外部的,如果沒提供呼叫申明的。
弱符號:
若兩個或兩個以上全域性符號(函式或變數名)名字一樣,而其中之一宣告為weak屬性,則這些全域性符號不會引發重定義錯誤。連結器會忽略弱符號,去使用普通的全域性符號來解析所有對這些符號的引用,但當普通的全域性符號不可用時,連結器會使用弱符號。當有函式或變數名可能被使用者覆蓋時,該函式或變數名可以宣告為一個弱符號。
示例:
//模組A中呼叫func,但是不確定外部是否提供了該函式
...
extern int func(void);
...
int a = func();
...
如果直接這麼呼叫,如果外部不提供該函式程式可能出現crash。
所以在本模組中__attribute__((weak))就派上了用場
int __attribute__((weak)) func(......)
{
return 0;
}
這樣的話如果模組B提供了func就呼叫模組B的,如果沒提供就呼叫本模組在中weak宣告的。