使用Haskell FFI来管理结构体; 以及如何使用FunPtr

4

我对Haskell中的FFI有一些问题。

首先,我正在尝试在Haskell中使用C结构体。

我有几个问题:我有一个类似于

struct foo{int a; float b;};
  1. 在什么情况下我会使用 data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  2. 什么情况下我需要使用 peek 和 poke 实现一个 storable?

好的,现在是有关 FunPtr 的问题:

  • 我不知道何时使用 FunPtr,为什么普通的定义如 Ptr CInt -> IO CInt 是不够的呢?
1个回答

9

Marshalling

为了将结构体编组,您需要使用Storable类实例通过peekpoke来回编组数据。

请参阅此先前的答案以获取示例:如何使用hsc2hs绑定常量、函数和数据结构?


FunPtr

FunPtr仅在您想要将函数作为一等值穿越FFI边界时才需要使用,而不是用于调用外部函数。具体而言:

类型为FunPtr a的值是一个指向可从外部代码调用的函数的指针。类型a通常是一个外部类型,一个带有零个或多个参数的函数类型

以下是注册回调函数的示例:

foreign import ccall "stdlib.h &free"
   p_free :: FunPtr (Ptr a -> IO ())

由于我们需要将p_free本身传递给Haskell函数,因此我们需要让Haskell知道这实际上是一个C函数。 FunPtr包装器控制这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接