C 強符號和弱符號

2021-08-28 21:38:40 字數 491 閱讀 8937

1) 不允許強符號被多次定義,也即不同的目標檔案中不能有同名的強符號;如果有多個強符號,那麼鏈結器會報符號重複定義錯誤。

2) 如果乙個符號在某個目標檔案中是強符號,在其他檔案中是弱符號,那麼選擇強符號。

3) 如果乙個符號在所有的目標檔案中都是弱符號,那麼選擇其中占用空間最大的乙個。

在 gcc 中,可以通過__attribute__((weak))來強制定義任何乙個符號為弱符號。

需要注意的是,__attribute__((weak))只對鏈結器有效,對編譯器不起作用,編譯器不區分強符號和弱符號,只要在乙個原始檔中定義兩個相同的符號,不管它們是強是弱,都會報「重複定義」錯誤。

弱符號對於庫來說十分有用,我們在開發庫時,可以將某些符號定義為弱符號,這樣就能夠被使用者定義的強符號覆蓋,從而使得程式可以使用自定義版本的函式,增加了很大的靈活性。(matlab裡有的函式如果不輸入引數,就使用系統預設引數,在這裡系統預設引數就應該是弱符號)。

強符號和弱符號

在c語言中,函式和初始化的全域性變數 包括顯示初始化為0 是強符號,未初始化的全域性變數是強符號。關於多個強弱符號定義型別不一致的主要有下面三種情況 1.兩個或兩個以上強符號型別不一致 2.有乙個強符號,其他都是弱符號 3.兩個或兩個以上弱符號型別不一致 對於情況一,編譯會報符號重定義錯誤。mapa...

13 強符號和弱符號

我們在編寫 的過程中經常會遇到一種叫做符號重複定義 multiple definition 的錯誤,這是因為在多個原始檔中定義了名字相同的全域性變數,並且都將它們初始化了。例如,在 a.c 中定義了全域性變數 global int global 10 在 b.c 中又對 global 進行了定義 i...

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

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