boost::spirit風味の#includeの仕方

前からboost::spirit風味のincludeの仕方・・・

と、散々書き連ねてきたのだが、果たして どんな感じなのだろうか?
簡単に言うとヘッダファイルをインクルードしただけでcファイルに記述されているものも取りこめる方法 みたいな・・・。
ライブラリを作る際に適している?書き方の一つだと思う。
イチイチ*.libを生成しなくてOKな所とかがイイかも。初心者さんだと結構ここら辺の事情分からないことが多く、ライブラリを使用できないと言うことが結構あるようで無いようで・・・。*1
どんな感じかちょっとメモ

base.hに普通に定義を書く
base.cに普通に関数本体を書く
base.cの先頭にユニーク(唯一の名前)な#define 定義をする(ここでは仮に HOGE_Cとしよう
base.hの最後の方(#ifndef HOGE_H #define HOGE_H #endifの中の最後の最後の行で)


#ifndef HOGE_C
# include "hoge.c"
#endif
とする。

これで以上完成。

でも、やっぱり少々、弱点があるようで。
例えば、

  • base.h base.c hoge.h hoge.cというファイルがあったとしよう
  • hoge.cではbase.hをインクルードして base.c内に記述している関数を呼び出そうとすると上手く行かないらしい。

その他に hoge.c base.cで同じ名前のstaticな関数があると名前が衝突しちゃうとか。

base.hにbase.cの読み込みを記述しているので
hoge.cをコンパイルしている時に見つけたbase.hで定義されている関数を見つける事が出来ないためらしい。*2

と、言う事で、ちょっと考える。

  • base.h base.c hoge.c hoge.h include.h があるとする。
  • base.h base.c hoge.c hoge.h は前記と同様に実装本体と定義に分かれている。
  • しかし、base.h hoge.hで*.cファイルのinclude部分は書かないで include.h部分に*.cファイルのインクルード部分を書く

これで一応回避はできる。

が、Rubyで使われているst.cとかには効力は無いようで・・・*3

d:id:studiokingyo:20041017で宣言したdkutil_cがboost::spirit風味のincludeをできるようになるかどうかは今のとこできないようである。

*1:こう言う風に分からない問題にぶち当たった場合はエラーの情報を元にgoogleで検索するとよろしい

*2:コンパイラによってどの*.cファイルからコンパイルするのかは決まっていないからだと思う

*3:後で調べてみたら、C++としてコンパイルするとコンパイルが出来ないらしい。しかし、別の条件でもコンパイルが出来ないこともある。もう謎過ぎて原因究明はムリっぽい