内部変数と外部変数

変数には、外部変数と内部変数の2つがあります。
そして、それぞれで変数の有効範囲が違います。 まずは、サンプルプログラムを見てみましょう。

スポンサーリンク

サンプルプログラム

ソースファイル名:main.c

実行方法

ソースを書き写して、実行してください。
a は外部変数と内部変数の二つで定義されています。 さて、a の値は、10 か 5 どちらが出力されるでしょうか?

内部変数と外部変数

今までは、変数を定義する時は、毎回 main 関数の中に定義してきました。
今回の例なら、main 関数内の

unsigned char in_char;

がそれにあたります。
このように、関数の中で定義する変数を内部変数と言います。
また、サンプルプログラムの

unsigned char out_char;

のように、関数の外で変数を定義する事もできます。
このように、関数の外で定義する変数を外部変数といいます。

内部変数と外部変数は、変数としての性質は同じですが、その適用範囲が違います。
適用範囲とは、その変数を使える場所と理解してもらえば大丈夫です。

さて、内部変数と外部変数の適用範囲はどうなっているのでしょうか。

内部変数の適用範囲

まず、内部変数の適用範囲です。
内部変数の適用範囲は、それが宣言された関数のみとなります。
今回の例の

unsigned char in_char;

は、main関数内で宣言されているので、適用範囲は main 関数のみとなります。
つまり、main を括る "{" から "}" までです。

void main()
{
	//----- ここが内部変数の適用範囲
}

適用範囲以外でその変数を使おうとするとエラーが起こるので注意してください。

外部変数の適用範囲

次に、外部変数の適用範囲です。
外部変数の適用範囲は、基本的にその変数が定義されているソースファイルの中となります。
今回の例なら、

unsigned char out_char;

が、外部変数にあたるのですが、out_charは、main.c の中ならどの関数でも使用可能です。
内部変数は関数内、外部変数はソースファイル内と覚えておきましょう。

名前の重複

サンプルプログラムを見ると、外部変数、内部変数、共に、

unsigned char a;

という宣言があります。
同じ変数名を使っているので、一見コンパイルエラーになりそうですが、この場合はなりません。
内部変数と外部変数は、名前が重複しても別々の変数として扱われるからです。

では、ここで一つ疑問が起こります。
a を main( ) 関数内で呼び出したらどちらの a になるのでしょう?

答えは、main 関数内で定義されている、内部変数の a になります。

今回のサンプルプログラムの実行結果を見ればそれがわかります。
a は 5 と出力されるはずです。
外部変数と内部変数で同じ名前の変数が定義されている時は、内部変数が有効となります。
これは必ず覚えておいてください。

この名前の重複は、上手に使えばとても便利な機能なのですが、これが原因でバグも起こりやすくなります。
できる事なら内部変数と外部変数の名前は別々の物にするべきでしょう。

スポンサーリンク