第10章 C言語の関数2 ~ 外部変数とstatic変数の説明を含む ~
リスト25を次のように変更してください。
-- リスト25`` --
#include <stdio.h>
int gl_cnt;
void counter( );
void main() {
int i;
for (i=0; i < 10; i++) {
counter();
printf("gl_cntは今、%dです\n", gl_cnt);
}
}
void counter( ) {
gl_cnt++;
}
変数 gl_cnt は、どこの「{ }」にも属していませんね。
つまり、この変数 gl_cnt は、自由の身なのです。
どこの関数からでも、使うことができますし、寿命も当然、プログラムの開始から終了までです。
便利なものだと思いましたか?
皆さんは、「関数には、引数なんかを使って渡さずに、
この外部変数を使えばいいのではないか」と思いませんでしたか?
確かに、外部変数は便利ではあります。
しかし、あまり多用されては、非常に困るのです。
関数がたくさんある時、どこで変数の値が変更されているかが、
さっぱり分からなくなってしまうからです。
ですから、外部変数が多く使われたプログラムは、非常にわかりづらいものになります。
外部変数は、よっぽどのことがない限り、使わないようにしましょう。
最後に一つ。
上記の宣言方法の外部変数は、本当にどこからでも使えてしまいます。
今のところ、皆さんが作っているプログラムは、どれも一つのファイルしか使ってないと思います。
配属後に、プロジェクトに付くと、数十から数百のファイルを使って、
一つのプログラムを作るかもしれません。
数百ものファイルの中で、自由に使える変数なんて、
便利を通り過ぎて、むしろ管理するのがたいへんです。
ですから、変数宣言をされたファイルでしか使えなくする方法が用意されています。
それは、以下のように、頭に static を付けることです。よほどのことがない限り、
外部変数には必ず static を付けるようにしてください。
static int gl_cnt;
これは、static 変数の static とは全く違う意味なので、混同しないでください。
何しろ、外部変数は、元々寿命がないので、static 変数にする必要がないのです。
あくまでも、この変数は変数宣言したファイルの中だけで、使えますよという意味です。
以上です。