我正在连接到C库,并且有一个功能
它的回调参数类型为(int (*fun) (void *))
。
我如何使用c2hs
处理此问题?我没有看到提到的回调
https://github.com/haskell/c2hs/wiki/Implementation-of-Haskell-Binding-Modules或http://www.cse.unsw.edu.au/~chak/papers/Cha99b.html。
在我的实际应用程序中,回调不进行任何计算 - 它只需要检查是否同时设置了某个标志,并且我想从Haskell线程设置它。 (所以显而易见的解决方法是在C land中声明回调和标志,并使用Haskell函数设置标志。)
(编辑)我还检查了https://wiki.haskell.org/Calling_Haskell_from_C但拒绝了它因为" ghc -c ...将创建Safe_stub.c ..."我确信编译到C早已不复存在。但实际上我得到了一个stub.h(我需要它吗?)和目标文件。
答案 0 :(得分:2)
我不知道c2hs是否对此有任何特殊支持,但听起来你想要的是一个'外来导入'包装器''。请参阅Haskell 2010报告here中的“动态包装器”。
具体来说,如果你有
foreign import ccall "c_name" c_function_that_takes_a_callback ::
FunPtr (Ptr Foo -> IO Int) -> IO () -- or whatever the whole type is
然后你想要
foreign import ccall "wrapper" makeFooWrapper ::
(Ptr Foo -> IO Int) -> IO (FunPtr (PtrFoo -> IO Int))
然后,您可以将Haskell中的回调实现为函数Ptr Foo -> IO Int
,将其传递给makeFooWrapper
,然后将结果传递给c_function_that_takes_a_callback
。