C プログラムのモジュール化と記憶クラス


宣言と定義

一般に C 言語の関数は「宣言(declaration)」と「定義(definition)」 によって記述される。

宣言

int get_some_value( int a, int b, int c);

定義

int get_some_value( int a, int b, int c)
{
  return ( a + b ) * c;
}
大きなプログラムはファイルを分割してそれぞれコンパイルされる。 使いたい関数の定義が呼び出すファイルの中にない場合、 プロトタイプ(宣言)だけを記述し、コンパイラに関数の仕様を 明示する。

プロトタイプ宣言の使用例

/* file1.c */

/* プロトタイプ宣言 */
int get_some_value( int a, int b, int c);

/* 呼び出し側 */
main()
{
  int answer;	
  answer = get_some_value( 1, 2, 3);
}

/* end of file */
プロトタイプ宣言だけを1つのファイルにまとめておくことも多い。 実は
#include < stdio.h >
は関数 printf(), scanf() などのプロトタイプ宣言の書かれたファイル stdio.h を引用するための記述である。


変数のスコーピング

グローバル変数
実行プログラム全体から参照できる。 関数の外で以下のように宣言する。
  int global_val;
他のファイルから参照するときは extern 宣言する。

ファイル内ローカル変数
あるファイルに含まれる関数すべてから参照できる。 関数の外で以下のように宣言する。
  static int file_local_val;
他のファイルからは参照できない。

関数内静的(static)変数
ある関数が保持する値で、プログラムが終了するまで消えない。 関数の中で以下のように宣言する。
  static int static_val;
他の関数からは参照できない。

関数内動的(auto)変数
ある関数が呼ばれるたびに確保される記憶領域である。 関数の中で以下のように宣言する。
  int static_val;
関数が終了すると同時に領域も消去される。


Takuya Nishimoto