c - 在 Ruby/Inline C 中接受未定义数量的参数

标签 c ruby variadic-functions splat ruby-c-extension

我正在尝试使用带 Ruby 的内联 C 重写一个高度递归的函数。该函数接受未定义数量的参数,即在 Ruby 中它看起来像这样:

    def each_entity(*types)
      # Do something and recurse.
    end

我正在尝试使用以下代码在内联 C 中模仿这一点:

    VALUE each_entity_c(int argc, VALUE *argv)
    {
      // ...
    }

但这会产生编译错误:

inline.rb:486:in `ruby2c': Unknown type "VALUE *" (ArgumentError)

这是在 C 中完成此任务的正确方法吗?如果是这样,是什么导致了这个错误?如果不是,它是如何完成的?

最佳答案

而不是使用 builder.c , 尝试 builder.c_raw (或 builder.c_raw_singleton )在定义您的方法时。您可能想将 VALUE self 添加到 args 列表的末尾,但在我的测试中它似乎可以使用或不使用。为了安全起见,也可能值得明确指定元数:

inline do |builder|

  builder.c_raw <<-EOS, :arity => -1
    VALUE each_entity_c(int argc, VALUE *argv, VALUE self)
    {
      // ...
    }
  EOS
end

使用 builder.c,Ruby Inline 将重写该函数,使其接受 Ruby VALUE 类型作为参数,并添加代码以将这些转换为您的 c 类型原版的。您正在编写已经需要 VALUE 参数的代码,因此不希望完成此转换,因此您需要使用 c_raw

关于c - 在 Ruby/Inline C 中接受未定义数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073264/

相关文章:

无法在OpenGL上绘制三角形

ruby-on-rails - Searchkick:Elasticsearch 没有索引 "FORBIDDEN/12/index read-only"?

将类型转换为 va_arg 返回

java - 结合 guava 的 ImmutableList 和 varargs

c - C 中的信号接收器线程和 pthread_join 停止程序

c - 有没有办法在 C 中遵循自下而上的方法?

c - gcc 使用 pkg-config 引发 "unrecognized command line option"错误

ruby - HAML - if/elsif 结构

ruby-on-rails - 可以在 ruby​​ on rails 中查看不扩展 "application/application.html.erb"吗?

c - 这个声明在 C11 标准中意味着什么(关于可变参数函数)?