著作一覧 |
C++からmrubyのライブラリを呼ぶのは、evalとかdefine_*とかについては問題ない。
しかし、独自のirbもどき(というか、parserを使うもの)を作ろうとすると、死ぬ。
というのは、mruby/compile.hの中の構造体には、mrb_boolを使っているものがあるからだ。
それの何が問題か?
mrb_boolは、mrbconf.hで以下のように定義されている。
# ifdef __cplusplus typedef bool mrb_bool; # else typedef unsigned int mrb_bool; # endif
これがまずいC++処理系がある。
というのは、C++のsizeof(bool)は未定義なのだ。(記憶違いとか、情報が古い可能性があるので、修正歓迎)
もし、Cでライブラリを生成すると、構造体には4バイトのフィールドが確保される。しかし、C++のプログラムがヘッダのみを参照すると、たまたまその処理系のsizeof(bool)が4でなければ、以降がずれる。
で、VC++ではsizeof(bool) == 1なのでずれたのだった。というか、見つけるまでえらく時間を潰した。
CとC++で共有したいヘッダでは、boolは使わないか古臭い方法だが#define BOOL unsigned int
したほうが良いかもね(だが、別解もある。C++でライブラリを作れば良いのだ)。
ジェズイットを見習え |
# ifdef __cplusplus<br>- typedef bool mrb_bool;<br>+ typedef unsigned int mrb_bool;<br># else<br>で良いかもしれません.
いつも unsigned int を使うようにしました。
どうもありがとうございます。サイズ重視でどちらもunsigned charかなぁと、なんとなく予想してたけど、外れちゃいました。