我正在尝试使用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:Casts尚未实现。
我猜这个问题的原因是C consts是使用Haskell预处理器无法处理的一些辅助函数(_IOW
和_IOR
)来定义的。但是,目前尚不清楚如何最好地解决这个问题。我尝试在#c ... #endc
部分中定义枚举并使用直接enum
挂钩,但这给出了完全相同的问题。
我应该放弃使用c2hs并使用别的东西吗?是否有一种明智的方法来解决这个问题,而不是简单地对常数值进行硬编码?
答案 0 :(得分:1)
c2hs的{#enum ... #}
功能只能真正处理整数枚举值,由C / C ++中的enum
定义。你正在处理这些#defines
和c2hs只是不处理这种情况。
您可能需要查看hsc2hs和bindings-dsl
,因为this answer from 2011建议适合处理更复杂的FFI示例。