c c 強符號與弱符號

2021-10-14 04:24:47 字數 819 閱讀 6875

編譯器預設函式和初始化了的全域性變數為強符號,未初始化的全域性變數為弱符號,也可以通過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...