

int a;←宣言

int b=10;←宣言と定義

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

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


CC BY-SA 3.0
2018-01-09T14:37:32.987
40845
2018-01-10T01:40:02.610
2018-01-09T23:04:50.013
4236
26931
question
c
宣言と定義の違い、extern宣言の意義


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

宣言した変数(ここではc)に値の **代入** です。


CC BY-SA 3.0
2018-01-09T15:38:21.253
40847
2018-01-09T15:38:21.253
3060
40845
answer


正しくは以下になります。  
グローバル変数の場合の説明です。

int a;  
宣言と定義です。  
aという名前のint型の入れ物が作られます。  
aの値は環境により異なります。

int b = 10;  
宣言と定義です。  
bという名前のint型の入れ物が作られます。  
bの値は10になります。

c = 100;  
宣言でも定義でもなく、代入です。

extern int d;  
宣言です。  
dという名前の入れ物は作られませんので、d を読み書きするためには別のファイルで int d; しておく必要があります。つまり、別のファイルで定義された d
にアクセスする場合に extern を使用します。


CC BY-SA 3.0
2018-01-09T15:43:44.270
40848
2018-01-09T15:43:44.270
26933
40845
answer


まず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]

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


CC BY-SA 3.0
2018-01-09T23:23:49.537
40850
2018-01-09T23:23:49.537
4236
40845
answer


> あとextern宣言の必要性が分かりません...。

についてですが、  
externな変数xxの宣言とは、

この翻訳単位(ソース)にはその実体は存在しないのですが、  
とりあえず「あるという仮定でコンパイル」してくださいね。  
変数xxの実体は他のソースにあるので、  
「リンク時にどっかのobjに見つかったらそれを使ってね」  
ということですね。

必要性については、上記の通り「自身の翻訳単位外に実体のある変数を利用する方法」  
というわけです。


CC BY-SA 3.0
2018-01-10T01:40:02.610
40851
2018-01-10T01:40:02.610
3793
40845
answer