2016-07-14 59 views
-2

我有以下一段代碼,我在需要使用它們的代碼之後定義了幾個外部(全局)變量。 爲了做到這一點,我使用關鍵字extern宣佈他們沒有保留他們的存儲。static中的關鍵字和外部變量C

int main(int argc,char *argv[]) 
{ 

    extern int a; 
    extern double b; 

    /* ...use the variables somehow... */ 

{ 

int a = 10; 
static double b = 2.0; 

,如果我這樣做,編譯器會抱怨說我定義b變量是靜態的(因而具有內部鏈接),當在我宣佈它爲外部量。 但是,如果我倒序並在使用它之前將其定義並在main(主要是我知道的...)中聲明它,那麼永久化就沒有問題。

static double b = 2.0; 

int main(int argc,char *argv[]) 
{ 

    extern int a; 
    extern double b; 

    /* ...use the variables somehow... */ 

{ 

int a = 10; 

那麼如果我想在定義它之前使用外部私有變量(即與內部鏈接)呢?這是禁止的,爲什麼?

+0

一些有用的閱讀在這裏http://stackoverflow.com/questions/2841762/why-wont-extern-link-to-a-static-variable重複或許? – Bathsheba

+0

與問題無關,但您的主簽名很奇怪:'int main void'。沒有必要'void' – SurvivalMachine

+0

@SurvivalMachine只是一個拼寫錯誤,謝謝。 – Luca

回答

1

extern關鍵字告訴編譯器我們引用的變量位於不同的翻譯單元(基本上是另一個源文件),而static關鍵字表示變量(在全局變量的情況下)是本地的當前的翻譯單元,並且不能在其他源文件中看到,因此將這兩個關鍵字一起使用是沒有意義的。

一旦聲明b作爲文件全球性的,它是在main可見,沒有必要再次聲明,你就可以使用它。 另一方面,如果在中聲明瞭不同的轉換單元作爲全局變量,則extern關鍵字將變爲必需。

+0

是的,但是如果我想在定義(預留存儲)之前使用它,該怎麼辦? 它需要成爲一個共享的全球?如果我想讓它成爲一個私有的全局(有內部鏈接) – Luca

+0

全局變量的存儲保留在程序的數據段中,並且在聲明它之前不能使用全局變量(除了extern,但正如我所說這用於來自不同翻譯單元的變量)。 – monkeyStix

+0

你應該格式化你的答案,並在句子的開頭使用大寫字母。 –