Haskell FFI:你如何包装C ++集合?

时间:2012-02-27 00:59:01

标签: haskell ffi c++-standard-library

我有一个返回vector<MyClass>的函数;什么是将其改为适合FFI的最佳方式?

我认为像:: [CIntPointer]这样的类型可能是一个很好的妥协,如果有可能的话。

1 个答案:

答案 0 :(得分:3)

您可以定义自己的C函数来分配,释放,插入,删除等。这些函数可以包装您想要访问的C ++容器。 例如:

extern "C" {

Obj * obj_create()
{
  return new Obj();
}

void obj_destroy(Obj * schema)
{
  delete obj;
  obj = NULL;
}
...
...
}

然后在FFI中声明它们并以任何你想要的方式包装它们。

data SomeObject

type Obj = Ptr SomeObject

foreign import ccall unsafe "obj_create"
    createObj :: IO Obj

foreign import ccall unsafe "obj_destroy"
    destroyObj_ :: Obj -> IO ()

foreign import ccall unsafe "&obj_destroy"
    destroyObj :: FunPtr (Obj -> IO ())

一些问题:

  1. 确保使用c ++编译器(g ++而不是gcc)编译C文件。这将确保正确地拾取stdc ++库。
  2. 在编译haskell端的程序/ lib时,将库位置(-L)和libs(-lboost *)传递给链接