2011-01-25 123 views
8

可能重複:
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. 

感謝您的幫助。

+0

許多重複,例如, ['全球'和'靜態全球'之間的差異](http://stackoverflow.com/questions/959889/difference-between-global-and-static-global) – 2011-01-25 10:12:04

+0

除了給出的所有答案,值得一提的是,所有靜態變量,無論它們在哪裏分配,以及所有全局變量(如上面的「b」)都受到「靜態初始化」的約束。這意味着它們必須在程序啓動前由程序初始化。因此,你可以通過它們被初始化的標準來保證。如果你沒有明確地初始化它們,它們被隱含地初始化爲零(或者指針爲NULL)。這使得它們與本地範圍變量不同。 – Lundin 2011-01-25 10:56:22

回答

5

一個static全局變量是本地translation unit它在定義,因此,如果您在兩個不同的翻譯單位界定static int a;,這將創建兩個獨立的變量。如果在兩個翻譯單元中定義非靜態全局變量int b;,則會遇到鏈接錯誤(但您可以在兩個翻譯單元之一中使用extern int b;來告訴鏈接程序它應該使用來自其他翻譯單元的全局變量)。

6

兩者都是變量定義,然而,在「全局聲明區域」中,施加到一個可變的static關鍵字限制了全局變量來僅在它被定義的翻譯單元看到。

+7

換句話說,如果它在`foo.c`文件中,那麼即使你'extern`,bar.c也不能訪問它。 – EboMike 2011-01-25 10:01:01

+0

@EboMike +1,謝謝你的進一步澄清 – SiegeX 2011-01-25 10:06:50

2

static int a只能在該文件中訪問。 int b可以通過extern int b從不同的文件訪問。

+0

要迂腐,如果你在一個頭文件中定義`static int a`,它將不能在該文件中訪問「; – 2011-01-25 10:02:33

1

靜態變量的壽命延長了整個程序的生命週期。但是,範圍規則仍然適用。

如果您在方法之外定義靜態變量(通常在類的開始處),您的變量將在該類中的任何位置可用。

您無法更改這些對象的值。它們通常用於存儲API密鑰等內容。

1
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音響破乳劑具有內部連接

相關問題