0

は定義されていると、最後の一つは宣言です:変数宣言とデータ型

auto int i; 

static int j; 

register int k; 

extern int l; 

同じ理由は何ですか?

+1

最後のものは 'int型の 'L'は、どこか別の場所に定義されていることをコンパイラに指示し、リンカーはそれを見つけるでしょう。 –

+0

*定義*と*宣言*の違いは何ですか? –

+0

@FelixPalmenはい –

答えて

1

最初の3つ(int i、static int j、レジスタint k)は定義です。整数がこの変換単位内にあるためのスペースを示し、このエンティティに対してリンカがすべての参照をiにリンクするようにアドバイスします。これらの定義のうち正確に1つよりも多いか少ない場合、リンカは不平を言うでしょう。

最後にextern int lは、lを導入/指定するだけなので宣言であり、新しいメモリアドレス/スペースは割り当てられません。必要に応じて、各コンパイル単位にextern int lを指定できます。 宣言は、翻訳単位に名前を導入したり、以前の宣言によって導入された名前を再宣言したりします。

+0

厳密に一度...(int n)のように、グローバルスコープで(n個の初期化されていない)変数を2回定義することはかなり合法です。 int i; ' –

+0

C言語では、int i;ファイルスコープ内(関数外)に宣言と仮定義があります。複数の暫定的な定義が可能です。 1つの定義のみが許可されます。 –

1

私は質問がC.

  • に用語宣言定義程度であると仮定し宣言は「何か」のコンパイラの名前とタイプを伝えます。

  • 定義は宣言ですが、さらに宣言されている「何かを」「作成します」。例えば。変数の場合、この変数にはいくつかの記憶領域が導入されます。

最初の3つの例では、実際に変数が作成されています。ストレージクラスautostatic、およびregisterはすべて、記憶期間を指定するだけです。対照的に、ストレージクラスexternは、この変数がと判明していますが、異なる変換単位に存在する可能性があることをコンパイラーに通知します。

たぶん機能の宣言定義を比較する例が理解し概念が容易になります。

// function declaration: 
int foo(int x); 
// (now we know a function foo should be "somewhere", but it doesn't exist yet) 

// function definition: 
int foo(int x) { 
    return x+1; 
}