2

我正在连接一个 C 库,并且有一个函数,它的回调参数类型为(int (*fun) (void *))

我将如何处理这个c2hs?我没有看到 https://github.com/haskell/c2hs/wiki/Implementation-of-Haskell-Binding-Moduleshttp://www.cse.unsw.edu.au/~chak/papers中提到的回调/Cha99b.html

在我的实际应用程序中,回调不做任何计算——它只需要检查是否同时设置了一些标志,我想从 Haskell 线程中设置它。(因此,显而易见的解决方法是在 C 语言中声明回调和标志,并让 Haskell 函数设置标志。)

(编辑)我还检查了https://wiki.haskell.org/Calling_Haskell_from_C但因为“ghc -c ...将创建Safe_stub.c ...”而拒绝了它,我确信对C的编译早已不复存在。但实际上我得到了一个 stub.h(我需要它吗?)和目标文件。

4

1 回答 1

2

我不知道 c2hs 是否对此有任何特殊支持,但听起来你想要的是“外国导入“包装器””。请参阅此处的 Haskell 2010 报告中的“动态包装器” 。

具体来说,如果你有

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.

于 2015-02-20T05:02:03.190 回答