我正在使用一个使用haskell库(pandoc)来完成某项工作的C库(libpandoc)。 C库为haskell包装器回调提供读写数据。典型的回调,我还想发送void *user_data
,以便回调不必依赖于全局变量。
但是,在互联网上搜索,我似乎无法弄清楚如何将Haskell传递给void *
变量。
CString是一个char *
(并且最终可以用作变通方法,但它并不是那么好)和通用Ptr,它可以指出事物。但是,这些事情似乎不包括void
(这也是可以理解的)。看Foreign.C我看不到任何有用的东西。
我的问题是,我可以用什么类型将这样的函数传递给Haskell?
int func(char *buffer, void *user_data);
...
that_haskell_function(..., func, my_data);
答案 0 :(得分:19)
我认为任何指针类型都应该有效,但Ptr ()
最有意义。
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign
import Numeric
foreign import ccall unsafe "foo"
c_foo :: Ptr () -> IO ()
main :: IO ()
main =
allocaBytes 8 $ \ptr -> do
c_foo ptr
x <- peek (castPtr ptr) :: IO Word64
putStrLn (showHex x "")
和C档:
#include <string.h>
void foo(void *ptr)
{
memset(ptr, 0xEB, 8);
}
给出结果:
ebebebebebebebeb