Haskell 中的 FFI,有关 LANGUAGE CPP 的问题以及如何将 ac 结构与 FFI 一起使用

发布于 2024-11-05 13:18:01 字数 338 浏览 0 评论 0原文

我对 Haskell 中的 FFI 有一些疑问

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

I have some questions about the FFI in Haskell

  1. 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
  2. i use a function in c which use a struct, how can i handle this in the FFI?
  3. when i have to use CInt and when just Int?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

少年亿悲伤 2024-11-12 13:18:01
  1. 如果启用 CPP 语言扩展,您就可以合法地将 C 预处理器语法合并到您的 Haskell 程序中。
  2. 访问结构体有点复杂。最简单的方法可能是使用 Storable 类型类,为结构体的每个字段定义 peekpoke 方法。 hsc2hs 工具可以提供帮助。
  3. 每当您需要将 Haskell Int 传递给 C 或从 C 传递时,您都可以使用 CInt,因为这将确保发生任何所需的编组(对于 CDouble 也是如此) >、CString 等)。

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


更多信息请参见:

  1. If you enable the CPP language extension, you can then legally encorporate C pre-processor syntax into your Haskell program.
  2. To access a struct is a little more complicated. The easiest way is probably to use the Storable typeclass to define peek and poke methods for each field of the struct. The hsc2hs tool can help.
  3. You use CInt whenever you need to pass a Haskell Int to or from C, as this will ensure any required marshalling takes place (same goes for CDouble, CString and so on).

The X11 package has many examples of defining and marshalling structs via the FFI.


More info in:

匿名。 2024-11-12 13:18:01
  1. CPP 是 C 预处理器。它允许您使用条件编译和 makros。通常,您不需要这个,但是一旦您拥有依赖于平台的代码,它就会变得有用,其中要编译的代码由外部脚本决定(就像使用自动工具一样)。
  2. 看看 c2hs
  3. 使用 Cint 仅适用于直接导入。编写高级绑定时,请切换到 Int,因为它不需要用户导入所需的库,并且是 Haskell 标准
  1. 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).
  2. Have a look at c2hs
  3. Use Cint only for the direct import. When writing a high-level binding, switch to Int as it doesn't requires the user to import the required libraries and is Haskell standard
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文