天天看點

__attribute__((weak))是什麼意思

最近在閱讀tcmalloc代碼時發現使用了很多__attribute__((weak)),上網搜了以下有所了解。

弱符号:

若兩個或兩個以上全局符号(函數或變量名)名字一樣,而其中之一聲明為weak symbol(弱符号),則這些全局符号不會引發重定義錯誤。連結器會忽略弱符号,去使用普通的全局符号來解析所有對這些符号的引用,但當普通的全局符号不可用時,連結器會使用弱符号。當有函數或變量名可能被使用者覆寫時,該函數或變量名可以聲明為一個弱符号。弱符号也稱為weak alias(弱别名)。

總結:

  • 給函數加上weak屬性時,即使函數沒定義,函數被調用也可以編譯成功。
  • 當有兩個函數同名時,則使用強符号(也叫全局符号,即沒有加weak的函數)來代替弱符号(加weak的函數)

以下轉自:https://blog.csdn.net/zzftimfan/article/details/41843235

參考:https://blog.csdn.net/l09711/article/details/18096231

https://blog.csdn.net/xyh01215_intosky/article/details/17685793

#if defined ( GNUC )

#ifndef __weak

#define __weak attribute((weak))

#endif

用于函數聲明,__weak聲明于函數時,在工程中可以沒有函數實體,當函數中有實體函數時(沒有帶__weak)在函數調用的時候隻調用沒有帶__weak的函數,如下:

int func(void)

{

Func_t();
           

}

__weak void Func_t(void)

{

}

其實這樣做的原因是為了使軟體架構更加利于擴充和相容;同時也滿足沒有實體函數而報編譯錯誤,如果在上述的結構中要求在Func_t函數中實作加法運算,函數隻要做如下修改:

void Func_t(void)

{

c=a+b;// 假設a,b,c都是全局變量;

}

PS:注意函數頭沒有帶__weak。