我正在尝试使用c2hs快速绑定(bind)某些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 const是使用Haskell预处理器无法处理的一些辅助函数(_IOW_IOR)定义的。但是,尚不清楚如何最好地解决此问题。我试过在#c ... #endc节中定义一个枚举,并使用直接的enum钩子(Hook),但这确实带来了相同的问题。

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

最佳答案

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

您可能希望研究hsc2hs和bindings-dsl,因为this answer from 2011建议适合处理更复杂的FFI示例。

10-06 02:45