スコープ

変数は必ず宣言してから利用する。ただし宣言したからといって、 プログラムのどこでも使えるようになるわけではなく、必ず有効範囲が 決まっている。この有効範囲のことをスコープという。

ブロックスコープ

変数は、宣言する場所によって利用できる場所が限定される。 変数は、宣言したブロックの中でのみその名前を参照できる。

#include <stdio.h>

void foo()
{
  int x;
  int y
  :
  :
}

int main(int argc, char *argv[])
{
 char buf[100];
 FILE *fp;
 if (NULL == (fp=fopen("score.dat", "r"))) {
   char altfile[10];
   printf("score.datがないので、代わりのファイル名を入れて: ");
   fgets(altfile, sizeof altfile, stdin);
   altfile[strlen(altfile)-1] = '\0';
   fp=fopen(altfile, "r");
  }
   :
   :
 }
}

関数 foo() 内で宣言した変数 x, y は その内部でのみ x, yの名前で参照できる。また、 main() 関数内で宣言した変数 buf, fpmain全体で参照でき、if ブロック内で宣言した altfile 変数はifの内部でのみ参照できる。

関数内部で宣言した変数のことを局所変数(ローカル変数)といい、 関数内部でのみ有効となる。逆に関数外部で宣言した変数は大域変数 (グローバル変数)といい、全ての関数で利用できる。一見便利に思えるが、同じ 名前の変数を使わないように気をつけなければならないので、原則として利用し てはいけない。

ファイルスコープ

全ての関数の外で宣言する変数は、原則としてリンクする 全てのソースファイルからアクセスできる。たとえば、 foo.c bar.c baz.c 三つのソースでプログラムを作成する場合、 foo.c

int hoge;

void abc() {...}
void xyz() {...}

として変数 hoge を宣言すると、bar.c baz.c からは、以下のように宣言すると変数 hoge を参照できる。

int hoge;

void tekitou()
{
 extern int x;
  :
}

逆に、キーワード static をつけて宣言した変数は、 そのファイルの中からしかアクセスできない。foo.c

static int hoge;

void abc() {...}
void xyz() {...}

と変数 hoge を宣言すると、foo.c の 中で定義している関数からしかアクセスできない。


目次