什麼是強符合和弱符號以及extern的用法

2021-10-17 05:22:03 字數 1422 閱讀 6572

1.強符號

在c語言中,函式和初始化的全域性變數(包括顯示初始化為0)是強符號。

2.弱符號

在c語言中,未初始化的全域性變數是弱符號。

3.強符號與弱符號之間的關係

了解到這裡我們來看第乙個問題

在c語言中為什麼不將全域性變數的定義放在標頭檔案中 

這是因為你的標頭檔案可能會被多個c檔案包含,這樣一來多個c檔案中就會有同乙個全域性變數的定義(強符號),鏈結器就會不知道該使用哪個符號來鏈結從而出錯(重定義)。宣告會被認為是弱符號所以標頭檔案中一般只寫宣告。

第二個問題

那麼我們如果想要在乙個檔案中呼叫另乙個檔案中的全域性變數該怎麼辦呢?

如果你想在本原始檔(例如檔名a)中使用另乙個原始檔(例如檔名b)的變數,方法有2種:

1.在a檔案中必須用extern宣告在b檔案中定義的變數(當然是全域性變數)。例如:

"b.h"//檔案b的標頭檔案

#pragma once

"b.c"//檔案b的.c檔案

#include#include"b.h"

int globe_b = 10;

"a.c"//檔案a的.c檔案

#include#include"b.h"

extern int globe_b;

int main()

我們看到此時的執行結果為10,說明此時a中使用的全域性變數globe_b,其實是檔案b中的globe_b。

2.在a檔案中新增b檔案對應的標頭檔案,當然這個標頭檔案包含b檔案中的變數宣告,也即在這個標頭檔案中必須用extern宣告該變數,否則,該變數又被定義一次。

"b.h"//檔案b的標頭檔案

#pragma once

extern int globe_b;

"b.c"//檔案b的.c檔案

#include#include"b.h"

int globe_b = 10;

"a.c"//檔案a的.c檔案

#include#include"b.h"

int main()

執行結果:

看到這裡我們就要引出另乙個問題了,即extern的用法。

作者較懶:詳情請參考:

強符號和弱符號

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

C 強符號和弱符號

1 不允許強符號被多次定義,也即不同的目標檔案中不能有同名的強符號 如果有多個強符號,那麼鏈結器會報符號重複定義錯誤。2 如果乙個符號在某個目標檔案中是強符號,在其他檔案中是弱符號,那麼選擇強符號。3 如果乙個符號在所有的目標檔案中都是弱符號,那麼選擇其中占用空間最大的乙個。在 gcc 中,可以通過...

13 強符號和弱符號

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