宣言と定義の違い、extern宣言の意義


int a;←宣言

int b=10;←宣言と定義

int c;  
c=100;←これは宣言と何でしょうか？

あとextern宣言の必要性が分かりません...。  
事前に話し合って特定の変数を定義しなければいいだけではないですか？




まずC言語とC++言語は異なる言語ですので正しく区別すべきです。また関数内に記述する場合と関数外に記述する場合とで、意味が異なります。

>
[code]

>     int a;
>  
[/code]

関数内の場合、ローカル変数の宣言と定義で、関数内（関数の実行中）でしか有効になりません。

関数外の場合、グローバル変数の宣言と定義です。`static`ストレージクラスを指定すると宣言されたソースファイル内でしか有効になりません。`extern`ストレージクラスを指定するとグローバル変数を宣言だけしたこととなり、定義はされません。この場合、このグローバル変数を使用することはできますが、他所で定義されないことにはコンパイルエラー（正確にはリンクエラー）となり実行ファイルを生成することはできません。逆に`extern`なしで複数個所にわたってグローバル変数の定義と宣言を繰り返した場合もリンクエラーになります。  
グローバル変数を正しくコンパイルするためには１ヶ所だけ`int a;`のように宣言と定義を行い、それ以外の個所では`extern int
a;`のように宣言だけを行う必要があります。

>
[code]

>     int b=10;
>  
[/code]

宣言と定義、それに加えて初期化をしてします。関数の内外どちらにも記述できます。

>
[code]

>     int c;
>     c=100;
>  
[/code]

１行目は宣言と定義です。２行目は代入で、関数外には記述できません。

