2012-01-20 5 views
1

私はこのコードを理解しようとしています:のextern Cの変数とその範囲

#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ファイルを意味するリンカーが各ファイルをリンクできるように、 "Make file"を作成する必要があります – Rave

+0

@Rave:すべての関連ファイルをリンクする必要があります。 'make'を使うことは、このプロセスを自動化する一つの方法です。 – NPE

2

問題ありません。変数をexternと宣言することにより、現在または他のソースファイルの一部がグローバルスコープのどこに定義されているかを、リンカに約束します。

1

グローバル変数の初期化は、main()が呼び出される前に発生します。

初期a = 20main()の実装の下に配置されている場合でもそう、それは常に最初に実行されますので、それは(あなたはズバリ、それはextern int aを使用して使用することがありますスコープ内の変数を宣言したと仮定して)プログラムの起動時に使用することができます。

+1

厳密に言えば、 'int a = 20'は代入ではなく初期化です。 –

+0

** extern **として宣言されていない場合、 'a'はメイン関数のスコープに入ることはできません。 http://ideone.com/BNXQs – Mahesh

+0

'a'はあなたの例では' main() '*で宣言されていません@Mahesh。何を狙っているのですか? –