我正试图为一个C库创建一个Haskell封装。底层的结构体过于复杂,难以明确表示为类型,而且我实际上只是用它们在C函数之间传递,所以我使用
我需要的是这些数据类型中的一个指针,但当我尝试使用
但这样接近于打败了目的——如果我不关心结构体中有什么,我不想定义这些东西。
我注意到指向指针的指针可以很好地工作,因为Ptr类是可存储的(Storable)。所以,在调用get_struct之前,在ptr上使用peek,就可以实现我想要的效果。
EmptyDataDecls
让GHC为我工作。我需要的是这些数据类型中的一个指针,但当我尝试使用
alloca
创建一个时,它抱怨数据不是Storable
类型。例如:{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
module Main where
import Foreign.Marshal.Alloc
import Foreign.Ptr
data Struct
foreign import ccall "header.h get_struct"
get_struct :: Ptr Struct -> IO ()
main = alloca $ \ptr -> get_struct ptr
GHC无法编译此代码,提示没有Storable Struct
的实例。我可以自己实现:
instance Storable Struct where
sizeOf _ = ...
alignment _ = ...
但这样接近于打败了目的——如果我不关心结构体中有什么,我不想定义这些东西。
我注意到指向指针的指针可以很好地工作,因为Ptr类是可存储的(Storable)。所以,在调用get_struct之前,在ptr上使用peek,就可以实现我想要的效果。
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr
虽然这种方法看起来像是个hack。
有没有一种方法可以使空数据声明被视为Storable
而不需要定义一个实例?
alloca
调用,然后将一个指针插入另一个指针中,对吗? - zmthyargv
)也会使用指向指针。 - John L