可能重複:
Difference between 'global' and 'static global'static int a和int a有什麼區別?
是什麼語句1和2之間的區別: -
#include <stdio.h>
//In the global declaration area
static int a; // 1.
int b; // 2.
感謝您的幫助。
可能重複:
Difference between 'global' and 'static global'static int a和int a有什麼區別?
是什麼語句1和2之間的區別: -
#include <stdio.h>
//In the global declaration area
static int a; // 1.
int b; // 2.
感謝您的幫助。
一個static
全局變量是本地translation unit它在定義,因此,如果您在兩個不同的翻譯單位界定static int a;
,這將創建兩個獨立的變量。如果在兩個翻譯單元中定義非靜態全局變量int b;
,則會遇到鏈接錯誤(但您可以在兩個翻譯單元之一中使用extern int b;
來告訴鏈接程序它應該使用來自其他翻譯單元的全局變量)。
static int a
只能在該文件中訪問。 int b
可以通過extern int b
從不同的文件訪問。
要迂腐,如果你在一個頭文件中定義`static int a`,它將不能在該文件中訪問「; – 2011-01-25 10:02:33
它們都在程序的整個生命週期的內存中。聲明爲靜態的變量僅在聲明該文件的文件中有作用域,因爲聲明爲非靜態的變量可以使用extern聲明從其他文件訪問。
原始來源 - http://bytes.com/topic/c/answers/860211-global-variable-static-global-variable
這個答案是最完整的一個提供。 – Lundin 2011-01-25 10:42:01
靜態變量的壽命延長了整個程序的生命週期。但是,範圍規則仍然適用。
如果您在方法之外定義靜態變量(通常在類的開始處),您的變量將在該類中的任何位置可用。
您無法更改這些對象的值。它們通常用於存儲API密鑰等內容。
static int a;
int b;
a
有內部聯繫。 b
有外部鏈接。
C99 6.2.2
6.2.2 identi音響ERS的連桿機構
1)一種identi音響ER在不同的範圍中聲明或在同一範圍內不止一次可以是 作出指代相同的對象或函數通過一個稱爲鏈接的進程。有 三種聯繫:外部,內部和無。2)在構成整個程序的翻譯單元和庫的集合中,每個 聲明一個特定的具有外部鏈接的標識符表示相同的對象或者 函數。在一個翻譯單元內,每個與內部 連接的標識符聲明表示相同的對象或功能。每個沒有 連接的標識符聲明表示一個獨特的實體。
3)如果一個文件範圍identi音響ER爲一個對象或一個函數的聲明包含存儲 - 類SPECI音響ER靜態的,identi音響破乳劑具有內部連接。
許多重複,例如, ['全球'和'靜態全球'之間的差異](http://stackoverflow.com/questions/959889/difference-between-global-and-static-global) – 2011-01-25 10:12:04
除了給出的所有答案,值得一提的是,所有靜態變量,無論它們在哪裏分配,以及所有全局變量(如上面的「b」)都受到「靜態初始化」的約束。這意味着它們必須在程序啓動前由程序初始化。因此,你可以通過它們被初始化的標準來保證。如果你沒有明確地初始化它們,它們被隱含地初始化爲零(或者指針爲NULL)。這使得它們與本地範圍變量不同。 – Lundin 2011-01-25 10:56:22