在Haskell FFI,问题关于语言CPP和如何使用一个c结构与FFI



我对Haskell中的FFI有一些疑问

  1. 我知道我必须使用语言pragma {-# LANGUAGE ForeignFunctionInterface #-},但是当我使用{-# LANGUAGE CPP, ForeignFunctionInterface #-}时有什么区别呢?我可以用CPP做"更多"的事情
  2. 我使用c中使用struct的函数,我如何在FFI中处理这个?
  3. 当我必须使用CIntInt时?
  1. 如果你启用CPP语言扩展,你就可以合法地将C预处理器语法合并到你的Haskell程序中。
  2. 访问结构体稍微复杂一些。最简单的方法可能是使用Storable类型类为结构体的每个字段定义peekpoke方法。hsc2hs工具可以提供帮助。
  3. 你使用CInt每当你需要传递一个Haskell Int到C或从C,因为这将确保任何所需的封送发生(同样适用于CDouble, CString等)。

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


更多信息见:

  • 关于Haskell wiki的FFI介绍
  • 外国。*在基础库
  1. CPP是C预处理器。它允许您使用条件编译和makros。通常,你不需要这个,但它变得有用,只要你有平台相关的代码,其中编译的代码是由外部脚本决定的(如autotools)。
  2. 查看c2hs
  3. 仅在直接导入时使用Cint。当编写高级绑定时,切换到Int,因为它不需要用户导入所需的库,并且是Haskell标准的

最新更新