c2hs:绑定常量



我正在尝试使用 c2hs 编写对某些 ioctl 函数(特别是获取和设置窗口大小)的快速绑定。这是我所拥有的相关部分:

{-# LANGUAGE ForeignFunctionInterface #-}
#include <sys/ttycom.h>
#include <sys/ioctl.h>
module A where
  import Foreign.Storable
  import Foreign.Ptr
  import Foreign.C
  {#enum define TIO {TIOCGWINSZ as GetWinsz, TIOCSWINSZ as SetWinsz} deriving (Eq) #}

(完整代码可在 https://gist.github.com/nc6/8977936 获得)

当我尝试编译它时,我得到:

c2hs:功能尚未实现: GenBind.evalConstCExpr:强制转换尚未实现。

我猜这个问题的原因是 C consts 是使用一些辅助函数(_IOW_IOR )定义的,而 Haskell 预处理器无法处理这些函数。但是,目前尚不清楚如何最好地解决此问题。我尝试在#c ... #endc部分中定义枚举并使用直enum钩,但这给出了完全相同的问题。

我应该放弃使用 c2hs 并使用其他东西吗?有没有一种明智的方法来解决这个问题,而不是简单地硬编码常量值?

c2hs 的{#enum ... #}功能仅真正处理由 C/C++ 中的enum定义的整数枚举值。您正在处理这些#defines,而 c2hs 只是无法处理这种情况。

你可能想研究一下 hsc2hs 和 bindings-dsl ,因为 2011 年的这个答案表明适合处理更复杂的 FFI 示例。

最新更新