強/弱符號和強/弱引用,主要用於描述靜態語言中符號連接的問題,對於C/C++而言,編譯器默認初始化的全局變量和函數定義爲強符號,未初始化的全局變量爲弱符號。連接器在處理強符號和弱符號時,遵循如下幾點規則。函數
由上面的表述咱們能夠知道,C語言中extern其實就是對弱符號的另外一種表達。符號的引用指的是對不一樣符號的使用,強引用和弱引用的主要區別在於,強引用限制符號必須已經定義,而弱引用符號則能夠未定義,而且當引用的符號未定義時並不會報錯,而是賦值爲0。若符號能夠用於開發程序插件,用戶自定義相關數據等。
對於弱符號和強符號在C語言中的使用,能夠參考下面的代碼。插件
// main.c extern void printLength(); static void hello() __attribute__((weakref("printHi"))); int gLength __attribute__((weak)); int main(int argc, char **argv) { hello(); printLength(); gLength = 100; printLength(); return 0; } // symbols.c #include <stdio.h> int gLength = 10; void printHi() { printf("Hello World!\n"); } void printLength() { printf("length=>%d\n", gLength); }
從上面的代碼中,能夠看出hello以弱引用的方式引用符號printHi,還能夠發現弱引用有點像別名,跟目標函數符號不一樣。而弱符號或者強符號,則限制在不一樣文件或模塊中的符號是名稱相同的。code