Haskell中的FFI,关于LANGUAGE CPP的问题以及如何在FFI中使用c结构

时间:2011-05-04 19:51:50

标签: haskell ffi

我对Haskell中的FFI有一些疑问

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

2 个答案:

答案 0 :(得分:6)

  1. 如果启用CPP语言扩展,则可以合法地将C预处理器语法包含在Haskell程序中。
  2. 访问结构有点复杂。最简单的方法可能是使用the Storable typeclass为结构的每个字段定义peekpoke方法。 hsc2hs工具可以提供帮助。
  3. 只要您需要将Haskell CInt传递给C或从C传递,就会使用Int,因为这将确保发生任何所需的编组(同样适用于CDouble,{{1}等等)。
  4. X11软件包通过FFI具有many examples个定义和编组结构。


    更多信息:

答案 1 :(得分:3)

  1. CPP是C预处理器。它允许您使用条件编译和makros。通常,您不需要这个,但只要您拥有与平台相关的代码,它就会变得有用,编译代码由外部脚本决定(就像使用autotools一样)。
  2. 查看c2hs
  3. 仅将Cint用于直接导入。编写高级绑定时,切换到Int,因为它不需要用户导入所需的库并且是Haskell标准