H8+C言語入門:第3章 何もしない(2):変数−通用範囲−
−文法(概要)−
「変数の通用範囲」について説明します。
変数の通用範囲を理解しておくことは、重要です。
先に例を見てもらいましょう。
例 int getLength(void);
int max; //(1)
void main(void){
int len;
max = 0;
len = getLength();
{
int getLength(void){
int len; //(2)
max++;
}
(1)はmain関数の外、(2)はgetLength関数の中に定義されています。
ブロック({と}で括られた部分)の制約もあるので、(1)と(2)は別に管理されますが、先ず、
(2)を見てみましょう。(2)は、getLength関数の中で宣言され、他の関数からは直接アクセ
スすることはできません。他の関数内にある変数も同様で、相互に参照することはできま
せん。
そして、(2)は、getLength関数が呼ばれた時のみ存在し、その関数の処理が終わり、main
関数に戻った時、消えてしまいます。
関数内部に宣言する変数のことを、局所変数、自動変数(自動的に作られて、消えていくの
で)、ローカル変数と呼ばれています(以下、ここでは「自動変数」とします)。
自動変数は、関数の呼び出しによって現れたり、消えたりしますから、一度呼び出されて
から次に呼び出されるまでの間、それらの値は保持されません(関数が終了すると、変数が
消えますからね)。従って、自動変数として宣言したものは、その変数を使う前に、必ず初
期化しておかなければなりません・・初期化しなくてもコンパイルはしますが、その時の
変数の値は、不定なので、どんな値が入ってくるのか保証されないからです。ここは、き
ちんと値をセットしましょう。
では、前述の例に戻って・・(1)の説明がまだでした。
これは、関数の外にあります。これは、外部変数、広域変数、グローバル変数と呼ばれま
す(以下、ここでは「外部変数」とします)。関数の中から参照することができます。
main関数で0に初期化したり、getLength関数でインクレメントしたりしているところが
そうです。
外部変数は、広域的にアクセス(参照、変数として利用できるということ)できますから、
関数間のデータのやり取りや、引数リストの代わりに用いられたりします。外部変数は、
自動変数と違い、関数が呼び出されたり終了したりすることに関係がないので、永久に存
在します。外部変数に値をセットしたり、計算した結果を保持した関数が終了しても、そ
の値は、残ったまま(保持されたまま)となります。
外部変数は、任意の関数の外側で定義されなければなりません。
そして、外部変数は、それが定義されたソースファイルの中では、自由に使うことができ
ます。
となると、ソースファイルを分割して作成した時、それぞれのソースファイルで発生する
データのやり取りをしたいけど、その方法は何か手段があるのかな?ということになりま
すが、これがあるんです。外部変数を使います。
例 <file1.c>
extern int getLength(void);
int max;
void main(void){
int len;
max = 0;
len = getLength();
}
<file2.c>
extern int max; //file1.cで宣言されている変数maxをここでも使う。
int getLength(void){
int len;
max++;
}
extern宣言をすることになります。これは、externに続く変数(や関数)が、外部にあるの
ですという、宣言をしています。
ソースファイルを分割して作る時などに忘れてはいけないことです。
ソースファイルは、一本で済む時は、特に必要がないものではあります。
この記事を表示