c++ - 在c(或c++)中使用rb_define_singleton_method

标签 c++ c ruby fftw

当我运行命令rakecompile时,我很难弄清楚为什么我的 rb_define_singleton 和 rb_define_method 调用会中断。

首先,一个问题可能是我实际上不确定最后一个整数参数实际上代表什么,以便决定使用什么值,并且我无法找到解释这一点的文档,但所以我觉得我是只是猜测,但问题似乎出在第三个参数中,所以我担心的是

其次,我的构建失败,在调用 make 时出现以下错误:

make compiling ../../../../ext/fftw/fftw.cpp ../../../../ext/fftw/fftw.cpp: In function 'void Init_fftw()': ../../../../ext/fftw/fftw.cpp:64:58: error: invalid conversion from 'VALUE ()(VALUE, VALUE) {aka long unsigned int ()(long unsigned int, long unsigned int)}' to 'VALUE ()(...) {aka long unsigned int ()(...)}' [-fpermissive] rb_define_singleton_method(cNMatrix, "r2c", fftw_r2c, 1); ^ In file included from /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/ruby.h:1694:0, from /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby.h:33, from ../../../../ext/fftw/fftw.cpp:1: /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/intern.h:216:6: error: initializing argument 3 of 'void rb_define_singleton_method(VALUE, const char*, VALUE ()(...), int)' [-fpermissive] void rb_define_singleton_method(VALUE, const char, VALUE(*)(ANYARGS), int); ^ make: * [fftw.o] Error 1 rake aborted!

该错误意味着我根本无法测试 ruby​​ 中的函数,因为我需要首先成功定义此定义,因此我已将文件剥离到最少以尝试执行此操作

到目前为止,我已经尝试过使用多种类型进行类型转换,但似乎都不起作用。我开始怀疑我在 extconf 中使用我的标志和编译器选择设置了错误,但我不确定。

source code for the failing file is on github

欢迎任何建议!谢谢

最佳答案

ruby C api 的文档有点缺乏。关于此的唯一“官方”文档是 extension.rdoc

您的 C 函数可以具有 20 个签名之一,但由于 C 中没有重载,因此创建所有 rb_define_method 变体的 20 个版本会给您使用的接口(interface)添加大量重复RUBY_METHOD_FUNC(your_function) 来类型化你的函数指针。

整数参数告诉 ruby​​ 您正在使用哪个签名:

0 到 17 表示您的 C 函数如下所示:

VALUE some_function(VALUE self, VALUE arg1, VALUE arg2); /* if you had passed 2 */

整数只是函数接受的参数数量,不包括 self (因此这也与 ruby​​ 中传递的参数数量相同)

-1表示你的函数应该有签名

VALUE some_function(VALUE self, VALUE *argv, VALUE argc);

即您将获得一个参数数组和参数数量。这也意味着 ruby​​ 将允许使用任意数量的参数调用该方法(即报告的数量将为 -1)。 rb_scan_args 在这种情况下通常很有用。

最后,-2 意味着你的函数看起来像

VALUE some_function(VALUE self, VALUE args);

args 是一个包含参数的 ruby​​ 数组(同样,这允许调用者传递任意数量的参数)。

不幸的是,类型转换意味着如果你犯了这个错误,你的代码将在运行时以某种未定义的方式崩溃,而不是编译时错误。

关于c++ - 在c(或c++)中使用rb_define_singleton_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829572/

相关文章:

c++ - g++中链接的Preprocessor程序类似于gcc中的cpp程序

c - 如何在 C 中使用正则表达式?

ruby-on-rails - 如何从模型在 Rails 3 中执行复杂的 Arel 查询

ruby-on-rails - Rails - 如何在数据库中存储 "has_many"复选框关联?

c++ - 如何使用反向迭代器从 `std::set` 删除元素?

c++ - 我正在尝试使用 ifstream 将这个 C 函数的等效代码转换为 C++

c++ - 向类中添加新功能

c - "new_dollars = dollars + cents/100"没有变化

ruby-on-rails - 为什么要在数据库主机上保留应用程序的副本?

c++ - 从 cv::Mat 转换为 QImage 的快速方法