編譯器預設函式和初始化了的全域性變數為強符號,未初始化的全域性變數為弱符號,也可以通過gcc "__attribute__((weak))"來定義任何乙個強符號變為弱符號。
gcc 中,我們也可以通過使用"__attribute__((weakref))"這個擴充套件關鍵字來宣告乙個對外部函式的引用為弱引用。(__attribute__((weak)))void foo();
這種弱符號與弱引用對於庫來說十分有用,比如庫中定義的弱符號可以被使用者定義的強符號所覆蓋,從而使得程式可以使用自定義版本的庫函式,或者程式可以對某些擴充套件功能模組的引用定義為弱引用,當我們將擴充套件模組與程式鏈結在一起的時,功能模組就可以正常使用。如果我們去掉某些模組,那麼程式也可以正常鏈結,只是缺少了相應的功能,這使得程式的功能更加容易裁剪和組合。
#include
__attribute__
((weak)
)void
show_msg()
intmain()
#include
void
show_msg()
gcc main.c
./a.out
weaksymbol test.
gcc main.c show.c
./a.out
strongsymbol test.
tcmalloc 也是利用強弱符號的規則,可以僅需要鏈結-ltcmalloc就可以替glibc分配方法 弱符號與強符號,弱引用與強引用
對c c 而言,編譯器預設函式和初始化了的全域性變數為強符號。未初始化的全域性變數為弱符號。此處弱符號與強符號均是針對定義來說的,不是針對符號的引用。也可以通過gcc的 attribute weak 來定義任何乙個強符號為弱符號。cpp view plain copy extern in ext i...
弱符號與強符號概念
from c語言的強符號和弱符號是c初學者經常容易犯錯的地方。而且很多時候,特別是多人配合開發的程式,它引起的問題往往非常行為怪異而且難以定位。什麼是強符號和弱符號?在c語言中,函式和初始化的全域性變數是強符號,未初始化的全域性變數時弱符號。強符號和弱符號的定義是聯結器用來處理多重定義符號的,它的規...
強符號和弱符號
在c語言中,函式和初始化的全域性變數 包括顯示初始化為0 是強符號,未初始化的全域性變數是強符號。關於多個強弱符號定義型別不一致的主要有下面三種情況 1.兩個或兩個以上強符號型別不一致 2.有乙個強符號,其他都是弱符號 3.兩個或兩個以上弱符號型別不一致 對於情況一,編譯會報符號重定義錯誤。mapa...