★ファイル分割(スコープ1)★


「スコープ」とは「適用範囲」と考えてもらえば分かりやすいかもしれません。

ファイルの分割を行うと、関数や変数の適用範囲という考え方が必要になります。

今回は、このスコープについて説明します。


まずは、1つのファイルを使ってプログラムを書いてみましょう。

どんな名前でも良いので、プロジェクトとcppファイルを作り、次のプログラムを打ち込んでください。

<sample program 163-01>

#include <stdio.h>

int main(void)
{
    int value = 12;

    printf("value = %d\n", value);

    return 0;
}

<実行結果>

value = 12
続行するには何かキーを押してください・・・

このプログラムの変数valueはmain関数の中で宣言されています。

main関数の中で宣言された変数は、main関数が終わるとメモリから解放されます。

このような変数を「ローカル」変数と言います。

「ローカル」とは「地域的な」という意味があり、限定的な場所という事です。

C言語でのローカル変数はブロックと呼ばれる{ から }の間でのみ使える変数という意味です。

main関数にも当然{ と }があり、変数valueはこの中でしか使えないということです。


ブロックというのは、関数だけでなくif文やfor文にもありますよね?

実は、if文やfor文の中でも変数宣言は出来ます。

上のプログラムを使って試してみましょう。

<sample program 163-02>

#include <stdio.h>

int main(void)
{
    int value = 12;

    printf("value = %d\n", value);

    if (value > 0) {

        int value2 = 5;

        printf("value2 = %d\n", value2);
    }

    return 0;
}

<実行結果>

value = 12
value2 = 5
続行するには何かキーを押してください・・・

適当なプログラムですが、エラーではありません。

しかし、変数value2はif文の{ から }が適用範囲ですから、その外では使えません。

これも試してみます。

<sample program 163-03>

#include <stdio.h>

int main(void)
{
    int value = 12;

    printf("value = %d\n", value);

    if (value > 0) {

        int value2 = 5;

        printf("value2 = %d\n", value2);
    }

    printf("value2 = %d\n", value2);

    return 0;
}

追加したコードの箇所でエラーが発生しました。

  error C2065: 'value2': 定義されていない識別子です。

宣言されたブロックの外では、使えないことが分かりました。


逆にブロックの外側で宣言された変数は、内部のブロックの中で普通に使用することが出来ます。

これまでも使ってきた事ですが、念のためプログラムを書いてみます。

<sample program 163-04>

#include <stdio.h>

int main(void)
{
    int value = 12;

    if (value > 0) {

        int value2 = 5;

        printf("value = %d\n", value);

        printf("value2 = %d\n", value2);
    }

    return 0;
}

<実行結果>

value = 12
value2 = 5
続行するには何かキーを押してください・・・

if文のブロックの中で変数valueは普通に使えます。


この理屈が通るのであれば、次のプログラムはどうでしょうか?

<sample program 163-05>

#include <stdio.h>

int value;

int main(void)
{
    value = 12;

    printf("value = %d\n", value);

    return 0;
}

main関数のブロックの外で変数valueを宣言しました。

上でブロックの外で宣言された変数は、内部のブロックの中で使える・・・と書きました。

コンパイルするとエラーはありません。

実行してみましょう。

<実行結果>

value = 12
続行するには何かキーを押してください・・・

普通に実行出来ました。


このように関数の外で宣言された変数は「グローバル」変数と呼ばれます。

「グローバル」とは「世界的な」とか「大域的な」という意味で、ブロックの枠を超えて使える変数だという事です。

複数の関数にもまたがって使えますので、次のようなプログラムでも動きます。

<sample program 163-06>

#include <stdio.h>

int value;

void ShowValue(void);

int main(void)
{
    value = 12;

    ShowValue();

    return 0;
}

void ShowValue(void)
{
    printf("value = %d\n", value);
}

<実行結果>

value = 12
続行するには何かキーを押してください・・・

ShowValue関数には引数がありません。

引数はありませんが、グローバル変数valueが使えますので、値の表示が出来ています。

  この考え方を使えば、引数が必要なくなる!

  面倒な引数を書かずに済むなら・・・

と考えた方は、待ってください。

なぜ、今まで引数について散々説明してきたのか・・・

グローバル変数があれば引数など不要!というのが常識であれば引数など説明しません。

大規模な開発になると、様々なメンバーがプロジェクトに加わります。

関数やファイルも非常に多く、1人で全てを把握することは出来ません。

その中で、誰でも使える変数があった場合、誰がどこで書き換えたのか分からなくなります。

バグが発生した時に、全てのプログラムを見直さなければなりません。

引数であれば const などのバグ予防策も使えます。

不必要な引数を渡すこともありません。

このグローバル変数は積極的に使うべきものでは無いのです。


次回は、ファイル分割を踏まえたスコープについての説明をします。


次へ

戻る

目次へ