Cの関数と記憶クラス

externとstaticの記憶クラスと関数宣言について。Cの関数の記憶クラスはデフォルトでextern。したがってヘッダファイルにかかれたプロトタイプ宣言はデフォルトでextern宣言がついていることになる。

-hoge.h--------
/* プロトタイプ宣言 */
int foo(int, int); // ← 特にexternをつけなくてもデフォルトでexternが宣言されている

-hoge.c--------
#incldue "hoge.h"
static int bar(int c, int d); // ←明示的にstaticをつけているので関数のスコープはhoge.c内

int foo(int a, int b) // ← 特にexternをつけなくてもデフォルトでexternが宣言されている
{
  /* */
}

static int bar(int c, int d) // ←明示的にstaticをつけているので関数のスコープはhoge.c内
{
  /* */
}

今までデフォルトでexternが宣言されているとは知らなかったので、hoge.hがhoge.c以外にincludeされたときにだけexternが宣言されるように#defineで宣言していた。以下のような感じ

#ifdef HOGE_C /* hoge.c内で宣言されている場合 */
 #define EXTERN         /* hoge.c内ならEXTERNはなくなる */
#else
 #define EXTERN extern  /* hoge.c以外なら、externがつく */
#endif

今までhoge.hで、EXTERN int foo(int, int);のように宣言していたのですが、不要だということがわかりました。この仕様から考えるに、関数の記憶クラスの範囲を最小限にするために、ファイル外に公開しない関数については積極的にstaticを関数につけてあげる必要があります。