7

我对 Haskell 中的 FFI 有一些疑问

  1. 我知道我必须使用语言编译指示,但是当我使用CPP 可以“更多”做什么时有什么{-# LANGUAGE ForeignFunctionInterface #-}区别{-# LANGUAGE CPP, ForeignFunctionInterface #-}
  2. 我在 c 中使用了一个使用 a 的函数,struct我该如何在 FFI 中处理这个?
  3. 我什么时候必须用CInt,什么时候才用Int
4

2 回答 2

6
  1. 如果您启用CPP语言扩展,您就可以合法地将 C 预处理器语法合并到您的 Haskell 程序中。
  2. 访问结构有点复杂。最简单的方法可能是使用typeclassStorable结构的每个字段定义peekpoke方法。hsc2hs工具可以提供帮助
  3. CInt每当您需要将 Haskell 传入或传出 C 时,您都可以使用Int,因为这将确保进行任何所需的编组(同样适用于CDoubleCString依此类推)。

X11 包有许多通过 FFI 定义和编组结构的示例。


更多信息在:

于 2011-05-04T19:57:23.073 回答
3
  1. CPP是 C 预处理器。它允许您使用条件编译和宏指令。通常,您不需要它,但是一旦您拥有依赖于平台的代码,它就会变得有用,其中要编译的代码由外部脚本决定(例如使用自动工具)。
  2. 看看c2hs
  3. 仅用于Cint直接导入。编写高级绑定时,切换到Int它不需要用户导入所需的库并且是 Haskell 标准
于 2011-05-04T19:57:33.730 回答