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

関連情報