我对Haskell中的FFI有一些疑问
- 我知道我必须使用语言pragma
{-# LANGUAGE ForeignFunctionInterface #-}
,但是当我使用{-# LANGUAGE CPP, ForeignFunctionInterface #-}
时有什么区别呢?我可以用CPP做"更多"的事情 - 我使用c中使用
struct
的函数,我如何在FFI中处理这个? - 当我必须使用
CInt
和Int
时?
- 如果你启用
CPP
语言扩展,你就可以合法地将C预处理器语法合并到你的Haskell程序中。 - 访问结构体稍微复杂一些。最简单的方法可能是使用
Storable
类型类为结构体的每个字段定义peek
和poke
方法。hsc2hs工具可以提供帮助。 - 你使用
CInt
每当你需要传递一个HaskellInt
到C或从C,因为这将确保任何所需的封送发生(同样适用于CDouble
,CString
等)。
X11包有许多通过FFI定义和编组结构的例子。
更多信息见:
- 关于Haskell wiki的FFI介绍
- 外国。*在基础库
-
CPP
是C预处理器。它允许您使用条件编译和makros。通常,你不需要这个,但它变得有用,只要你有平台相关的代码,其中编译的代码是由外部脚本决定的(如autotools)。 - 查看c2hs
- 仅在直接导入时使用
Cint
。当编写高级绑定时,切换到Int
,因为它不需要用户导入所需的库,并且是Haskell标准的 。