ものづくりBLOG blog page

第3章 何もしない(2):変数−通用範囲−

2011-01-01 (Sat) 03:02
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に続く変数(や関数)が、外部にあるの
 ですという、宣言をしています。
 ソースファイルを分割して作る時などに忘れてはいけないことです。
 ソースファイルは、一本で済む時は、特に必要がないものではあります。

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0