From: Robert Feldt Date: 2000-06-20T16:33:55+02:00 Subject: [ruby-talk:03558] Re: Extension in C++? On Tue, 20 Jun 2000, Yukihiro Matsumoto wrote: > Hi, > Hi and thanks for the prompt reply. > In message "[ruby-talk:03532] Extension in C++?" > on 00/06/20, Robert Feldt writes: > > |Extending Ruby in C is simple and pretty straightforward. I'm considering > |putting together an extension based on some C++ classes I have. Do I have > |to take any special measures to interface C++ and Ruby as compared to Ruby > |and C? Would it, for example, work to Wrap_Struct(class MyCppClass) > |directly or is there other ways? Can extconf and mkmf handle cpp > |files? Anyone done this and have some sample code? > > There's no difference between C and C++ in writing extension, except > you have to wrap initialize function (Init_xxx) by extern "C". > When I make the file below gcc won't compile it since ANSI C++ does not allow pointer conversion. I guess one solution is to turn the ANSI C++ standard off but I'm not sure that's a good solution (or how you do it!). Am I missing something? Should you do this in some other way? If some compiler option will do the trick maybe mkmf-funcs should sense the use of c++ and add the compiler options automagically? Sorry if this is obvious... ------------rubycpp.cpp ----------------- #include class Func { public: int f(int x) { return 2*x; } }; VALUE cFunc; static void rbcpp_free(Func* obj) { delete obj; } static VALUE rbcpp_init(VALUE self) { Func* new_obj = new Func; return Data_Wrap_Struct(cFunc, 0, rbcpp_free, new_obj); } static VALUE rbcpp_f(VALUE self, VALUE x) { Func* obj; Data_Get_Struct(self, class Func, obj); return INT2NUM(obj->f(NUM2INT(x))); } extern "C" void Init_rubycpp() { cFunc = rb_define_class("Func", rb_cObject); rb_define_method(cFunc, "f", rbcpp_f, 1); rb_define_method(cFunc, "initialize", rbcpp_init, 0); } -------------------------------------------- Regards, Robert Ps. Compiler output: gcc -DUSEIMPORTLIB -I/usr/local/lib/ruby/1.4/i686-cygwin -g -O2 -I/usr/local/include -c rubycpp.cpp -o rubycpp.o rubycpp.cpp: In function `VALUE rbcpp_init(long unsigned int)': rubycpp.cpp:16: ANSI C++ prohibits conversion from `(Func *)' to `(...)' rubycpp.cpp: In function `void Init_rubycpp(...)': rubycpp.cpp:27: ANSI C++ prohibits conversion from `(long unsigned int, long uns igned int)' to `(...)' rubycpp.cpp:28: ANSI C++ prohibits conversion from `(long unsigned int)' to `(.. .)' make: *** [rubycpp.o] Error 1 bash-2.04$