2012/06/26

C言語 static 関数

関数にstaticを使って簡易カプセル化。関数にstaticキーワードを使うことで、その関数は同一ファイル内(モジュール内)でしか基本的には呼び出せないようになる。これを利用することで、1ファイルがオブジェクト指向のクラスに相当するような使い方ができそうだ。ということで実験。

main関数 a.c

/* a.c */
#include "a.h"
int main(void){
  funcB1();
  /* funcB2(); 直接呼び出せない 簡易カプセル化 */
  return 0;
}

実装ファイル b.c

/* b.c */
#include <stdio.h>
static void funcB2(void){
  int num = 1;
  printf("funcB2 %d\n",num);
  num++;
}

void funcB1(void){
  int num = 1;
  printf("funcB1 %d\n",num);
  num++;
  funcB2();
}

ヘッダファイル a.h

/* a.h */
#ifndef A_H
#define A_H

void funcB1(void);

#endif
メイン関数から funcB1 関数を呼び出すのだが、staticの付いている funcB2 は呼び出すことはできずコンパイルエラーになる。b.c 内の関数からはstaticなfuncB2にもアクセスできる。外部からのアクセスを制限し、窓口を限定しておくことで、秩序が作られる。ファイル単位で機能をモジュール化し、クラスっぽい扱いが出来るようになる。
funcB1 1
funcB2 1
今回の記事は、具体的なプログラミングを組もうと試していたら関数の構成方法で迷い始めたのがきっかけ。C言語では構成が適当でもプログラムは動く。関数ごとに整理するにしても、オブジェクト指向のような構成方法が示されているわけでもない。実際、入門書には文法的なことは書かれているが、ファイルの構成方法などには触れていない。これからは、構成方法を試行錯誤して行くことになりそうだ。オブジェクト指向ほどきっちりしていなくてもいいので、自分で再利用とかメンテがしやすい構成が作れればよい。設計段階ではUMLのシーケンス図を描くといいかもしれない。

C言語 ANSI C89 Meadow & MinGW GCC 目次