[英]Static vs global
如果我有一個像下面這樣的 C 文件, i
和j
之間有什么區別?
#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.