C 言語 | 構造体の宣言 | 関数の記憶クラス

関数の宣言では、extern 指定子と static 指定子を使って記憶クラスを指定できる。ほかのソースファイルから呼び出せないように関数を隠すには、static を付けて宣言する。

関数の可視性

関数には、変数のような内部レベルはない。関数は常にグローバルな有効期間を持ち、同じファイル内であればどこからでも参照できる。ただし、関数を呼び出す前にプロトタイプ宣言が必要であることは、関数の宣言の記事で説明した。

複数のファイルを同時にコンパイルすると、変数と同様に関数名も衝突する可能性がある。そのため、関数にも記憶クラスがある。関数に指定できる記憶クラスは staticextern である。

static 記憶クラスを持つ関数は、その関数を定義したファイル内からだけ呼び出せる。ほかのファイルの関数からは呼び出せない。反対に、extern 関数はほかのファイルからも呼び出せる。記憶クラスを省略した場合は、暗黙的に extern が使われる。

コード 1

#include <stdio.h>

void Function1(void);
void Function2(void);

int main() {
 /*Function1();  /*error*/
 Function2();
  return 0;
}

コード 2

static void Function1() {}
extern void Function2() {}

コード 1 とコード 2 を同時にコンパイルすると、main() 関数から Function2() は呼び出せるが、Function1() はコード 1 から見えないため呼び出せない。コメントになっている Function1() の呼び出しを有効にするとエラーになる。Function1()static 記憶クラスを持つため、外部ファイルから見えない。

これは、特定のファイル内の処理に特化した関数を作るときに役立つ。独立性が低い関数には static 記憶クラスを指定し、名前の衝突を避けるとよい。