我正在尝试使用 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 示例。