弱符號與強符號,弱引用與強引用

2021-09-07 16:25:17 字數 845 閱讀 5106

對c/c++而言,編譯器預設函式和初始化了的全域性變數為強符號。未初始化的全域性變數為弱符號。此處弱符號與強符號均是針對定義來說的,不是針對符號的引用。也可以通過gcc的 「__attribute__((weak))」來定義任何乙個強符號為弱符號。

[cpp]view plain

copy

extern in ext;  

int weak;  

int strong = 1;  

__attribute__((weak)) int weak2 = 1;  

int main()    

其中,強符號為:strong 與 main,弱符號為 :weak 與 weak2,而ext 即非強符號與非弱符號,因為它是乙個外部變數的引用。針對強弱符號,鏈結器會根據下述規則來選擇被多次定義的全域性符號:

2.如果符號在某個檔案中是強符號,在其他檔案中是弱符號,則選擇強符號

3.如果乙個符號在所有檔案中都是弱符號,則選擇其中占用空間最大的。如弱符號 weak 在 a 檔案中定義為double,在檔案b中定義為 int, 則在鏈結a,b時,weak 的大小為 double的大小。

對弱引用,編譯器一般預設其值為0,在gcc中,使用「__attribute__((weak))」來宣告對乙個外部符號的引用為弱引用。通常對弱引用的使用方式如下:

[cpp]view plain

copy

__attribute__((weak)) void func();  

int main()    

如:庫中定義的弱符號可以被使用者定義的強符號覆蓋,從而使程式可以使用自己定義版本的庫函式

ARM 強符號與弱符號 強引用和弱引用

強符號與弱符號 可以通過使用 attribute weakref 這個擴充套件關鍵字來宣告對乙個外部函式的引用為弱引用 這種弱符號和弱引用對於庫來說十分有用,比如庫中定義的弱符號可以被使用者定義的強符號所覆蓋,從而使得程式可以使用自定義版本的庫函式 或者程式可以對某些擴充套件功能模組的引用定義為弱引...

關於C語言中的強符號 弱符號 強引用和弱引用

首先我表示很悲劇,在看 程式設計師的自我修養 鏈結 裝載與庫 之前我竟不知道c有強符號 弱符號 強引用和弱引用。在看到3.5.5節弱符號和強符號時,我感覺有些困惑,所以寫下此篇,希望能和同樣感覺的朋友交流也希望高人指點。首先我們看一下書中關於它們的定義。引入場景 1 檔案a中定義並初始化變數i in...

GCC中的強符號和弱符號及強引用和弱引用

u boot和kernel比較普遍地使用了 weak來定義函式。在include linux compiler gcc.h中 weak是這樣定義的 define weak attribute weak gcc通過 attribute weak 指令定義的函式或變數稱為弱符號 weak symbol ...