我有很多 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 端分配和内存,并使用终结器释放它。