kagamihogeの日記

kagamihogeの日記です。

includeにハマる

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重定義することになってしまう。

今回は関係ないけど、コンパイルは上からやっていくのでヘッダーのインクルード順序に気をつけないといけない場合もあるらしい。なんと面妖な・・・。