Haskell 中的 FFI,有关 LANGUAGE CPP 的问题以及如何将 ac 结构与 FFI 一起使用
我对 Haskell 中的 FFI 有一些疑问
- ,我知道我必须使用语言 pragma
{-# LANGUAGEforeignFunctionInterface #-}
但是当我使用{-#LANGUAGE CPP,foreignFunctionInterface 时有什么区别#-}
我可以用 CPP 做“更多”什么, - 我在 c 中使用一个使用
struct
的函数,我如何在 FFI 中处理这个问题? - 什么时候我必须使用
CInt
,什么时候只使用Int
?
I have some questions about the FFI in Haskell
- I know i must use the language pragma
{-# LANGUAGE ForeignFunctionInterface #-}
but what is the difference when i use{-# LANGUAGE CPP, ForeignFunctionInterface #-}
what can i do "more" with the CPP - i use a function in c which use a
struct
, how can i handle this in the FFI? - when i have to use
CInt
and when justInt
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
CPP
语言扩展,您就可以合法地将 C 预处理器语法合并到您的 Haskell 程序中。Storable
类型类,为结构体的每个字段定义peek
和poke
方法。 hsc2hs 工具可以提供帮助。Int
传递给 C 或从 C 传递时,您都可以使用CInt
,因为这将确保发生任何所需的编组(对于CDouble
也是如此) >、CString
等)。X11 包具有 通过 FFI 定义和编组结构的许多示例。
更多信息请参见:
CPP
language extension, you can then legally encorporate C pre-processor syntax into your Haskell program.Storable
typeclass to definepeek
andpoke
methods for each field of the struct. The hsc2hs tool can help.CInt
whenever you need to pass a HaskellInt
to or from C, as this will ensure any required marshalling takes place (same goes forCDouble
,CString
and so on).The X11 package has many examples of defining and marshalling structs via the FFI.
More info in:
CPP
是 C 预处理器。它允许您使用条件编译和 makros。通常,您不需要这个,但是一旦您拥有依赖于平台的代码,它就会变得有用,其中要编译的代码由外部脚本决定(就像使用自动工具一样)。Cint
仅适用于直接导入。编写高级绑定时,请切换到Int
,因为它不需要用户导入所需的库,并且是 Haskell 标准CPP
is the C preprocessor. It allows you to use conditional compilation and makros. Usually, you don't need this, but it becomes useful, as soon as you have platform-dependent code, where the code to compile is decided by an external script (like with the autotools).Cint
only for the direct import. When writing a high-level binding, switch toInt
as it doesn't requires the user to import the required libraries and is Haskell standard