C 言語 | 構造体の宣言 | 関数の記憶クラス
関数の宣言では、extern 指定子と static 指定子を使って記憶クラスを指定できる。ほかのソースファイルから呼び出せないように関数を隠すには、static を付けて宣言する。
関数の可視性
関数には、変数のような内部レベルはない。関数は常にグローバルな有効期間を持ち、同じファイル内であればどこからでも参照できる。ただし、関数を呼び出す前にプロトタイプ宣言が必要であることは、関数の宣言の記事で説明した。
複数のファイルを同時にコンパイルすると、変数と同様に関数名も衝突する可能性がある。そのため、関数にも記憶クラスがある。関数に指定できる記憶クラスは static と extern である。
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 記憶クラスを指定し、名前の衝突を避けるとよい。