私はこのコードを理解しようとしています:のextern Cの変数とその範囲
#include<stdio.h>
int main()
{
extern int a;
printf("%d\n", a);
return 0;
}
int a=20;
私はそれを実行すると、a
の値は20です。しかし、グローバル変数a
が定義されているので、これは、不可能でなければなりません一番下に
私はこのコードを理解しようとしています:のextern Cの変数とその範囲
#include<stdio.h>
int main()
{
extern int a;
printf("%d\n", a);
return 0;
}
int a=20;
私はそれを実行すると、a
の値は20です。しかし、グローバル変数a
が定義されているので、これは、不可能でなければなりません一番下に
extern
の宣言は、グローバル変数でのみ使用できます。グローバル変数が他の場所で定義されていることをコンパイラーに伝え、リンカーにそれを理解するように要求します。
コードでextern int a
は、例の下部に定義されているa
を指します。異なる翻訳単位でも同様に定義できました。
他の人が指摘しているように、a
の初期化はmain()
が入力される前に行われます。
問題ありません。変数をextern
と宣言することにより、現在または他のソースファイルの一部がグローバルスコープのどこに定義されているかを、リンカに約束します。
グローバル変数の初期化は、main()
が呼び出される前に発生します。
初期a = 20
がmain()
の実装の下に配置されている場合でもそう、それは常に最初に実行されますので、それは(あなたはズバリ、それはextern int a
を使用して使用することがありますスコープ内の変数を宣言したと仮定して)プログラムの起動時に使用することができます。
厳密に言えば、 'int a = 20'は代入ではなく初期化です。 –
** extern **として宣言されていない場合、 'a'はメイン関数のスコープに入ることはできません。 http://ideone.com/BNXQs – Mahesh
'a'はあなたの例では' main() '*で宣言されていません@Mahesh。何を狙っているのですか? –
リンカーは自動的にそれを認識しますか、それとも指定する必要がありますか? 複数のCファイルを意味するリンカーが各ファイルをリンクできるように、 "Make file"を作成する必要があります – Rave
@Rave:すべての関連ファイルをリンクする必要があります。 'make'を使うことは、このプロセスを自動化する一つの方法です。 – NPE