強符號、弱符號和強引用、弱引用

強符號、弱符號和強引用、弱引用

強/弱符號和強/弱引用,主要用於描述靜態語言中符號連接的問題,對於C/C++而言,編譯器默認初始化的全局變量函數定義爲強符號,未初始化的全局變量爲弱符號。連接器在處理強符號和弱符號時,遵循如下幾點規則。函數

  1. 強符號不容許被屢次定義,即不一樣的文件中不可以存在相同符號定義。
  2. 強符號和弱符號同時存在時,使用強符號。
  3. 多個弱符號,選擇佔用內存最大的弱符號。

由上面的表述咱們能夠知道,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

相關文章
相關標籤/搜索