Использование RB_require с RB_Protect для встраивания Ruby в C

StackOverflow https://stackoverflow.com//questions/9664616

  •  12-12-2019
  •  | 
  •  

Вопрос

Я хочу использовать RB_require с RB_Protect, как в следующем примере:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);
.

Но когда я компилируюсь, я получаю эту ошибку:

passing argument 1 of ‘rb_protect’ from incompatible pointer type [enabled by default]
/usr/include/ruby-1.9.1/ruby/intern.h:357:7: note: expected ‘VALUE (*)(VALUE)’ but argument is of type ‘VALUE (*)(VALUE,  VALUE)’
.

После поиска в Google, чтобы увидеть, как использовать RB_require с RB_Protect, я попробовал:

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);
.

или

VALUE require_wrap(VALUE arg)
{
return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);
.

Но я всегда получаю ту же ошибку.Эта ошибка не останавливает компиляцию, а двоичное SegFault, когда я запускаю его, тогда как все работает без RB_Protect.

__ Редактировать __

В моем исходном файле произошла ошибка.На самом деле все решения, которые я проверил хорошо работает:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);
.

или

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);
.

или

VALUE require_wrap(VALUE arg)
{
  return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);
.

Спасибо

Это было полезно?

Решение

Решения, которые хорошо работает:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);
.

или

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);
.

или

VALUE require_wrap(VALUE arg)
{
  return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top