変数のスコープについて書いてみる。

新人にスコープについて話をしてみたから、頭の整理がてら変数のスコープについて書いてみる。多分新人はスタック領域というものを理解していない。なのでまずはスタック領域について整理してみる。

スタック領域

用は取得する必要がない、汎用メモリのことと思ってよい。汎用的に使用できるため、初期化してやらないとわけのわからない値が入っている。スタック領域を使用するときは絶対に初期化を行うこと。関数内というより「{」〜「}」まで使用できると考えていい。僕の場合はわかりやすいように関数の頭で変数を定義するようにしている。グローバル変数の場合はファイルの一番上だ。使用する直前に定義するのがいいという人もいるが、メモリ領域の話よりも可読性を高めるソースのほうが僕は好きだ。そこは好みの問題だと思う。

以下、ソースコード

// グローバル変数。これはファイル内のどの関数でも使用することが出来る
int global;

function temp_a() {
    int i;
    int temp;

    temp_b();

    // 初期化云々の話はおいといて、アクセスすることは出来る。
    printf("%d", global);
}

function temp_b() {
    // ここで宣言しているiはtemp_b()内でしか使用できない。
    // また、temp_a()で宣言しているiとは全く別物となる。
    int i;

    // これは間違い。temp_a()にあるtempにはアクセスできない。
    // printf("%d",temp);
}

// グローバル変数。これはtemp_a()、temp_b()からアクセスすることは出来ない。
int global_hoge;

global_hogeがどの関数からもアクセスできない理由は、コンパイラは基本的に上から順番にコンパイルを行っていくからだ。temp_a()、temp_b()が宣言されている箇所では、まだglobal_hogeは宣言されていない。そのため、コンパイラは「そんな変数しらねーよ」とはじいてしまう。

ふつーにこんな説明をしてみたけどわかってくれない。。。明日もうちょっと編集してみよう。