1. 程式人生 > >__attribute__((weak)) 簡介及作用

__attribute__((weak)) 簡介及作用

最新在看專案新架構程式碼上看到了有使用到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宣告的。