c - Haskell FFI - 如何处理接受或返回结构而不是指向结构的指针的 C 函数?

标签 c haskell ffi

当然,答案是以某种方式传递/获取连续的内存块,所以问题更多的是关于如何做到这一点。现在我仍然可以通过在 C 端编写包装函数来避免这个问题,但这并不是一个永久的解决方案。

最佳答案

FFI 不支持按值任意传递 Haskell 可存储类型。

您只能传递类型的值(其中一些是指针):

Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.

因此,要传递结构,您必须通过 C 包装器包装调用;它接受一个指针并将其值传递给您希望实际调用的 C 函数。

最近的 GHC 扩展允许“primop”导入——绕过 FFI 机制并支持任意调用约定和通过未装箱的元组传递结构。例如

foreign import prim "ITCHv41_run"
  parseITCHv41# :: Addr# -> Word#
                -> (# Int#, Word#, Word#, Word#, Word#, Word# #)

您可以使用这些来做 tricky low level stuff像这样。

关于c - Haskell FFI - 如何处理接受或返回结构而不是指向结构的指针的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903940/

相关文章:

c - C语言中如何交换十六进制数?

haskell - 收集两个一元操作的结果

c - 将数组分配给* mut c_void

ruby - 安装 ffi ruby​​ gem 时找不到 ffi.h

c - LuaJIT FFI加载dll错误

C:如何将指针(数组元素)转换为int?

c - 当我只需要一个输入时,为什么 getchar() 需要两个输入?

haskell - 在Haskell中为逻辑表达式生成真值表

haskell - 一般而言,可折叠仿函数是否有相当于头/尾的东西?

c - scanf 读取带整数的加号,但不读取减号、乘法或除法