Javaでは複数クラス使っての開発経験はあるが、Cでモジュール分割する手法はぜんぜん経験がない。つーわけでちょっと興味半分で試して見たが、見事にハマった。
まず、ヘッダーなんかの構成をこんな風に書いてみた。
/* hoge.h */
struct hoge {...}export void func_hoge(...);
/* ex_hoge.h */
#include "hoge.h"export void func_ex_hoge(struct *hoge);
/* Main.c */
#include "hoge.h"
#include "ex_hoge.h"int main(int argc, char[] *argv) {
struct hoge *h;
func_ex_hoge(h);
...
}
mainからex_hoge.hの関数と、hoge.hの構造体使うからヘッダーのインクルードは2ついるだろう、と書いてたらなんかエラーが出る。「'hoge' : 'struct' で示される型としてすでに定義されています。」とかなんとか。
原因はヘッダーファイルのことぜんぜん知らない自分なわけだけど、Javaのimportと似たようなものだと思い込んでたのがよくなかった。
インクルードは文字通り「取り込み」なわけで、単にソースの置き換えをしているだけのものらしい。なので、ex_hoge.hがhoge.hを既にインクルードしているため、Main.cでhoge.hとex_hoge.hをインクルードするとstruct hogeを2重定義することになってしまう。
今回は関係ないけど、コンパイルは上からやっていくのでヘッダーのインクルード順序に気をつけないといけない場合もあるらしい。なんと面妖な・・・。