int i; // A.
extern int i; // B.
私はAが変数の定義であることを知っています。すなわち、コンパイラはオブジェクトを作成し、変数i
にメモリのブロックを割り当てます。しかし、Bとは何ですか?定義と宣言の違いは何ですか?Cのintとextern intの違いは何ですか?
int i; // A.
extern int i; // B.
私はAが変数の定義であることを知っています。すなわち、コンパイラはオブジェクトを作成し、変数i
にメモリのブロックを割り当てます。しかし、Bとは何ですか?定義と宣言の違いは何ですか?Cのintとextern intの違いは何ですか?
ケースA)は、外部リンケージを伴う「一時的な定義」である。 1つの翻訳単位で複数の変数を持つことができ、すべてが同じ変数を参照します。この定義は、翻訳単位に明示的な初期化子を持つ他の定義がない場合、変数をゼロ初期化するだけなので、一時的と呼ばれます。
ケースB)は宣言であるが、初期化子が存在せず、記憶域が予約されていないため、定義(暫定またはその他)ではない。この変数または別の翻訳単位のどこかに変数の有効な定義がなければなりません。スコープで内部リンケージを持つ変数の前の宣言がある場合、変数は
extern int foo;
static int foo;
のに対し、内部リンケージを持つ有効な仮定義ではそうでない場合は、外部、すなわち
static int foo;
extern int foo;
結果、内部リンケージを持つことになります外部リンケージで宣言し、その後に内部リンケージで(仮の)定義を続けると無効です。
詳細については、C99セクション6.2.2および6.9.2を参照してください。
これは宣言です。それは他のところで定義される整数i
があると言います。
externキーワードは、定義ではなく変数宣言を導入します。あるソースファイルのどこかには、与えられた宣言で定義された変数があり、ソースファイルがその変数を手間をかけずに参照できるようになりますが、実際に変数を定義するわけではありません。これにより、1つのファイルに定義された1つの変数を、各ファイルが独自の独立したコピーを持たずに、複数のソースファイルにわたって共有およびアクセスすることができます。
Bは、変数i
が別の場所、通常は異なる翻訳単位で定義されていると述べています。 Wikipedia articleはあなたの研究を続けるのに悪い場所ではありません。
A)変数iを宣言するだけでなく、実際にiの暗黙の定義です。
B)iの宣言。変数iは、some whereと定義する必要があります。
私は彼らが正しく声明と呼ばれていると思いますか? –
@Matt:宣言と呼ぶ –