C言語のスコープ
C言語のスコープについて解説します。
ローカル変数のスコープ
まずローカル変数のスコープについてです。ローカル変数のスコープは、関数の内部で定義されます。
ブロックはローカル変数のスコープを作る
ローカル変数のスコープはブロックによって作られます。ブロックは関数内部で使われた「{」と「}」で閉じられた部分と考えてください。
// 関数のブロックはスコープを作る void foo(void) { // if分のブロックはスコープを作る if (1) { } // while文のブロックはスコープを作る for (条件) { } // while文のブロックはスコープを作る while (1) { } // switch文のブロックはスコープを作る switch (条件) { case 1: break; case 2: break; } // ブロックだけもOK { 1; } }
ローカル変数の見え方
ローカル変数は、スコープごとに定義できます。自分のスコープにローカル変数が見つからない場合は、一つ上のスコープのローカル変数を探しに行きます。以下、繰り返し。ローカル変数が見つからない場合は、ファイルスコープを持つグローバル変数、それも見つからない場合は、グローバル変数を探しに行きますが、これは、後ほど解説します。
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num1 = 11; int32_t num2 = 12; int32_t num3 = 13; printf("[SCOPE1]num1: %d, num2: %d, num3 :%d\n", num1, num2, num3); if (1) { int32_t num1 = 21; int32_t num2 = 22; printf("[SCOPE2]num1: %d, num2: %d, num3 :%d\n", num1, num2, num3); { int32_t num1 = 31; printf("[SCOPE3]num1: %d, num2: %d, num3 :%d\n", num1, num2, num3); } } }
出力結果です。どこで宣言された変数が見えているか、よく見てみましょう。
[SCOPE1]num1: 11, num2: 12, num3 :13 [SCOPE2]num1: 21, num2: 22, num3 :13 [SCOPE3]num1: 31, num2: 22, num3 :13