對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 ...