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をできるようになるかどうかは今のとこできないようである。