C言語で、記憶クラス指定子extern・staticを関数に指定
C言語の本に、「関数の定義と呼び出す側が別ソースファイルの場合、プロトタイプはヘッダーファイルに書き、定義側と呼び出し側の両方でインクルードしましょう」ということが書かれていました。
例えば、
===code1a.c===
extern void funcB(int);
static void funcA()
{
funcB(1);
}
===code1b.c===
void funcB(int a)
{
printf("%d\n",a);
}
このような場合には、もしcode1b.cの中の関数funcBに引数を追加した場合、再コンパイルしても気づかないのでよくない。
そこで、次のようにヘッダーファイルを作り、プロトタイプはそこに書くべきだ。
***code2b.h***
extern void funcB(int);
***code2a.c***
#include "code2b.h"
static void funcA()
{
funcB(1);
}
******code2b.c****
#include "code2b.h"
void funcB(int a)
{
printf("%d\n",a);
}
記述は以上のようなことです。
#include "code2b.h" とは、
extern void funcB(int);
が書いてあるのと同じだと思います。
私が思ったのは、本の勧める方法では、
funcBを定義しているcode2b.cで、プロトタイプの記憶クラス指定子が、externになっているが良いのか(externとは、別のソースファイルで定義されているという意味ではないか)ということです。
extern, staticは、プロトタイプに書くべきなのか、関数の定義に書くべきなのか、も両方に書くべきなのでしょうか。
私の処理系では、
・プロトタイプ宣言でexternを付けて関数定義でstaticを付ける、
・staticを付けた関数を他のソースファイルで呼ぶ、
などの明らかに矛盾する場合は、コンパイルエラーになります。
でも、extern単独での役割はなさそうです。
他の処理系でも同じでしょうか。
(main等省略)
補足
「.cod」です。