Haskell FFI - 你能从Haskell数据结构中获取C指针吗?



我有很多 C 结构结构,结构如下

typedef struct {
    unsigned int a;
    unsigned int b;
} StructA;

还有很多功能,比如

void doSomethingWith(StructA*,StructB*,StructC*);

有没有一种简单的方法可以使用 Haskell FFI 调用这些函数?比如,有没有像 C 中的 & 运算符一样的东西?(我想没有,但如果有,我想知道)。我是否必须使 Haskell 端data 的实例可存储(我没有任何这些结构的构造函数)。

另外:如果我必须传递结构而不是结构指针(不是一个假设的问题,我有一些这样的函数 - 这不是我的代码,所以我对此无能为力),我可以只传递结构的组件吗?就像我想打电话一样

void function(StructA);

我可以这样做吗

foreign import ccall "function" :: CUInt -> CUInt -> IO()

要将对 Haskell

数据的引用传递给 C,其中内存在 Haskell 堆中分配,C 将直接对数据进行操作,您需要:

  • 确保它在内存中具有正确的形状(通过将 A 映射到与 StructA 相同的字节结构的 Storable 实例)。
  • 通过 mallocForeignPtr 在 Haskell 堆上分配和填充固定内存

在这种方法中需要考虑几个后果:

  • 一旦你删除了对 ForeignPtr 的所有引用,GHC 就会取消分配该值——所以你需要确保 C 端不会再次接触它
  • 你让 C 弄乱了 Haskell 堆上的东西,所以要确保它是正确的

其他选项:

  • 通过StablePtr将不透明的引用传递给 C
  • C 端分配和内存,并使用终结器释放它。

最新更新