【问题标题】:Using FFI to Attach_function to a C Function with variable argument lists?使用 FFI 将 Attach_function 附加到具有可变参数列表的 C 函数?
【发布时间】:2013-09-06 22:44:37
【问题描述】:

简单的情况,比如 printf(str, [arg1, arg2, ...])

如何使用 FFI 编写一个 ruby​​ 'attach_function' 调用来利用这样的函数?

我很惊讶我无法通过谷歌搜索找到这个问题的答案,但也许我使用了错误的术语。

--更新-- 也许我不够清楚。我已经在编写一个与 C 库接口的 RubyGem。它的工作已经很好了。我正在使用 FFI,并且一直运行良好,直到我使用变量参数列表点击此函数。

【问题讨论】:

    标签: ruby ffi


    【解决方案1】:

    在 ruby​​ 中使用 C 函数的规范方法是通过为其创建 gem 来扩展 ruby​​。没有像 Haskell 那样直接的方法。

    但是,为 ruby​​ 编写 C gem 是一项相当容易的任务,几乎与在 Haskell 中使用 FFI 一样容易。你可以看到 this free chapter from ruby pickaxe 教如何创建一个简单的 C gem,应该足够了。

    编辑

    如果您的问题是可变参数和 ffi,假设您使用的是ffi gem,您可以查看the examples on documentation,此示例显示了如何操作:

    require 'ffi'
    
    module Hello
      extend FFI::Library
      attach_function 'printf', [:string, :varargs], :int
    end
    
    3.times {  Hello.printf("cputs %s %d %x", :string, "yoyo", :int, 33, :int, 34)} # each one needs its own specifier of which type it is
    

    如果您尝试此操作但没有成功,请让我们查看您的代码并告诉我们出了什么问题

    【讨论】:

    • 我特别提到了 Ruby 的 FFI。
    • @BadQuanta 我的错,修复了答案。但是,如果您已经在编写 gem,则只会回答您的好奇心。
    • 非常感谢,这正是我需要的答案。我一直在谷歌上搜索“FFI Ruby 变量参数”,完全忽略了文档的那一部分。
    • @BadQuanta 很高兴为您提供帮助。看起来很奇怪,这些函数被称为 variadic 或简称为 varargs - 这可能会在你的下一个谷歌搜索中帮助你。
    • 此示例代码在这里不起作用。有一个错误:LoadError: no library specified 但是,我只是通过ffi_lib 'c'Hello 模块中包含了默认的C 库,之后,代码在这里运行良好。非常好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多