最近のmrubyでC++を使ったmrbgemを作る時の注意事項的な何か

extern "C"と直接書いてはならない

MRB_BEGIN_DECL

MRB_END_DECL

で囲む。

なんでか?

2016年の11月以降から、デフォルトだと
C++を使うmrbgemを組み込んだmrubyは.cファイルもC++としてコンパイルされることに
なったから。

この状態では、

extern "C"

と記述してしまうと、C++としてコンパイルされた.cファイルからリンクできずにエラーとなる。

デフォルトだと多くのCのコードでエラー

Cのコードとしては問題ないコードでも、C++としてはコンパイルすると
エラーとなることが多々ある。

例えば

C++では、void *への変換は暗黙にできるが、void *から他の型への変換は、明示的なキャストが必要

で結構引っかかった。

/home/junichi/work/mruby/mruby-webcam/mruby/build/mrbgems/mruby-socket/src/socket.c: In function ‘mrb_value mrb_addrinfo_getaddrinfo(mrb_state*, mrb_value)’:
/home/junichi/work/mruby/mruby-webcam/mruby/include/mruby/boxing_no.h:25:35: error: invalid conversion from ‘void*’ to ‘addrinfo*’ [-fpermissive]
 #define mrb_ptr(o)      (o).value.p

じゃぁ、これまでとおりにCをCとしてビルドするには

build_config.rbの前の方に

conf.disable_cxx_exception

ただし、これを入れるとC++を使ったモジュールで-lc++なり、C++の標準ライブラリの
明示的なリンクが必要。