簡體   English   中英

靜態 vs 全局

[英]Static vs global

如果我有一個像下面這樣的 C 文件, ij之間有什么區別?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}

i具有內部鏈接,因此您不能在其他源文件(嚴格來說是翻譯單元)中使用名稱i來引用同一個對象。

j具有外部鏈接,因此如果您在另一個翻譯單元中將其聲明為extern ,您可以使用j來引用此對象。

i在模塊外不可見; j是全局可訪問的。

也就是說,與它鏈接的另一個模塊可以做

extern int j;

然后能夠讀取和寫入j的值。 同一個其他模塊無法訪問i ,但可以聲明它自己的實例,甚至是全局實例 - 第一個模塊不可見。

不同的是, i有內聯, j有外聯。 這意味着您可以從鏈接的其他文件訪問j ,而i僅在聲明它的文件中可用。

i將有靜態鏈接,即該變量只能在當前文件中訪問。

j應定義為extern ,即

extern int j;

在另一個頭文件( .h )中,然后它將具有外部鏈接,並且可以跨文件訪問。

盡管您將文件作為不同源文件的一部分包含在內,但靜態變量/函數的范圍在同一個文件中。

全局變量的范圍遍及包含它的所有文件。 要將變量包含在不同的源文件中,我們在變量聲明之前使用extern 在這種情況下,不會再次為變量分配內存。

extern用於聲明一個 C 變量而不定義它。 extern關鍵字擴展了 C 變量和 C 函數的可見性。 由於默認情況下函數在整個程序中都是可見的,因此在函數聲明/定義中不需要使用extern 它的使用是多余的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM