変数
スコープ
スコープとは変数の有効範囲のことで、
「{」で始まり「}」で終了します。
例えば関数内で宣言した変数は関数の外で使用することはできません。
これは関数内の変数がスコープの外にあるからです。
上のソースでlocal_valをtest_funcとmain関数の両方で使用していますが、
local_valの宣言はtest_func関数のみです。
スコープは宣言を行っているtest_func関数のみとなりますので、
main関数のlocal_valは範囲外です。
ローカル変数
ローカル変数とは関数内で宣言した変数のことです。
ローカル変数のスコープは宣言した変数の
ひとつ外の「{}」の中に限ります。
変数aaaのスコープはひとつ外の「{}」ですので、
main関数の「{}」になります。
次のbbbですが、bbbを宣言した箇所のひとつ外の{}は
if (aaa == 0)の{}になるので、if文の中がスコープとなります。
グローバル変数
グローバル変数とはスコープを持たない変数のことです。
関数の外で宣言した変数はグローバル変数として扱われます。
gobal_valは関数の外で宣言されていますので、グローバル変数となります。
この変数のスコープで制限されることはありませんので、
有効範囲はソース全体になります。
なので、gobal_valをtest_funcやmain関数で使用してもエラーになりません。
グローバル変数の注意
グローバル変数はどこでも値を変更することができる
便利な変数ですが、どこでも変更が可能ということは、
どこでどのような値が設定されるか特定しづらいということです。
グローバル変数を使用した箇所でエラーが発生した場合、
使用箇所が多岐にわたりすぎて発生箇所の断定が
困難になる場合もあります。
そのようなことにならないように極力グローバル変数の使用を
控えたソースを書いてください。
変数の優先順位
変数はひとつのスコープで同じ変数名の宣言はできませんが、
スコープが異なった場合は使用可能です。
その際は最も内側のスコープの変数が代入などの対象となります。
グローバルとローカルで同一の名前を使用した例
int val = 100;
void print_val(void)
{
printf("printf_val val = %d\n", val);
}
int main(void)
{
int val = 10;
if (val == 100)
{
int val = 1;
printf("main val if = %d\n", val);
}
printf("main val = %d\n", val);
print_val();
return 0;
}
出力結果:
main val if = 1
main val = 10
printf_val val = 100