C ++ в расширениях Ruby C, проблемы с указателями

Я пытаюсь создать расширение Ruby C, которое использует некоторые библиотеки C ++. Проблема в том, что я даже не могу заставить работать простой мир.

//hello_world.cpp
#include <ruby.h>static VALUE tosCore;

static VALUE my_function( VALUE self )
{
VALUE str = rb_str_new2( "Hello World!" );
return str;
}

extern "C"void Init_hello_world( void )
{
tosCore = rb_define_module("Core");
rb_define_module_function(tosCore, "my_method", my_function, 0);
}

Я получаю вывод

compiling hello_world.cpp
hello_world.cpp: In function 'void Init_hello_world()':
hello_world.cpp:17:67: error: invalid conversion from 'VALUE (*)(VALUE) {aka lon
g unsigned int (*)(long unsigned int)}' to 'VALUE (*)(...) {aka long unsigned in
t (*)(...)}' [-fpermissive]
In file included from c:/Ruby200/include/ruby-2.0.0/ruby.h:33:0,
from hello_world.cpp:2:
c:/Ruby200/include/ruby-2.0.0/ruby/ruby.h:1291:6: error:   initializing argument
3 of 'void rb_define_module_function(VALUE, const char*, VALUE (*)(...), int)'
[-fpermissive]
make: *** [hello_world.o] Error 1

Я не эксперт C / C ++. Руби мой язык. Я собрал несколько тысяч строк C ++ под Рис без проблем, но так как я хочу, чтобы это конкретное расширение компилировалось под Windows, Rice не вариант.

3

Решение

Это потому что функция обратного вызова вы представляете rb_define_module_function это не то, что ожидает компилятор. Он хочет, чтобы функция выглядела так:

VALUE my_function(...)

Но ваша функция

VALUE my_function( VALUE self )

Обратите внимание на разницу в списке аргументов.

Один из способов избавиться от ошибки, это тип актерского состава аргумент типа, который rb_define_module_function надеется:

rb_define_module_function(tosCore, "my_method",
reinterpret_cast<VALUE(*)(...)>(my_function), 0);

Вы можете прочитать о reinterpret_cast Вот.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]