2012-01-20 78 views
1

我想了解此代碼:的extern變量及其範圍

#include<stdio.h> 
int main() 
{ 
    extern int a; 
    printf("%d\n", a); 
    return 0; 
} 
int a=20; 

當我運行的a值是20。然而,這應該是不可能的,因爲全局變量a定義在底部。

回答

3

extern聲明只能與全局變量一起使用。它告訴編譯器,全局變量是在別處定義的,並要求鏈接器找出它。

在您的代碼中,extern int a指的是在示例底部定義的a。它可能在不同的翻譯單位中有相同的定義。

正如其他人指出的,a的初始化發生在main()被輸入之前。

+0

鏈接器是否會自動找出它,還是我必須指定它? 我的意思是對於多個C文件,我必須製作一個「製作文件」,這樣鏈接器才能鏈接每個文件 – Rave

+0

@Rave:您必須將所有相關文件鏈接在一起。使用'make'是使這個過程自動化的一種方法。 – NPE

2

沒問題。通過將變量聲明爲extern,您有希望將其定義的鏈接器定義爲全局範圍內當前或其他源文件的一部分。

1

全局變量的初始化發生在調用main()之前。

所以即使初始化a = 20所在的main()實施下,它總是先執行,因此它可以在程序開始使用(假設你恰當宣佈作用域的變量,其中它的使用extern int a使用)。

+1

嚴格地說,'int a = 20'不是賦值,而是初始化。 –

+0

如果它沒有被聲明爲** extern **,則'a'不能在main函數的範圍內。 http://ideone.com/BNXQs – Mahesh

+0

在你的例子@Mahesh中'a'沒有在'main()'*中聲明*。你想帶來什麼? –