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