「スコープ」とは「適用範囲」と考えてもらえば分かりやすいかもしれません。
ファイルの分割を行うと、関数や変数の適用範囲という考え方が必要になります。
今回は、このスコープについて説明します。
まずは、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 などのバグ予防策も使えます。
不必要な引数を渡すこともありません。
このグローバル変数は積極的に使うべきものでは無いのです。
次回は、ファイル分割を踏まえたスコープについての説明をします。