トップ «前の日記(2013-04-23) 最新 次の日記(2013-04-29)» 編集

日々の破片

著作一覧

2013-04-28

_ mrubyで死ぬ

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++でライブラリを作れば良いのだ)。

本日のツッコミ(全3件) [ツッコミを入れる]
_ もなか (2013-04-29 09:12)

# ifdef __cplusplus<br>- typedef bool mrb_bool;<br>+ typedef unsigned int mrb_bool;<br># else<br>で良いかもしれません.

_ まつもと (2013-04-29 09:24)

いつも unsigned int を使うようにしました。

_ arton (2013-04-29 09:35)

どうもありがとうございます。サイズ重視でどちらもunsigned charかなぁと、なんとなく予想してたけど、外れちゃいました。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え