3

我正在尝试使用 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 是使用Haskell 预处理器无法处理的一些辅助函数 (_IOW和) 定义的。_IOR但是,目前尚不清楚如何最好地解决此问题。我尝试在一个#c ... #endc部分中定义一个枚举并使用直enum钩,但这给出了完全相同的问题。

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

4

1 回答 1

1

{#enum ... #}c2hs的特性只真正处理整数枚举值,如enumC/C++ 中的 an 所定义。你正在处理这些#defines,而 c2hs 只是不处理这种情况。

您可能想查看 hsc2hs 和bindings-dsl,因为2011 年的这个答案表明它适合处理更复杂的 FFI 示例。

于 2014-02-22T20:13:34.810 回答