我将Haskell函数暴露为C / C++

foreign export ccall foo :: Ptr CInt -> CInt -> IO CInt

foo ptr len = do
  list <- peekArray (fromIntegral len) ptr
  -- run calculation based on list entries
  return result

导出函数的签名变为
HsInt32 foo(HsPtr a1, HsInt32 a2);

但是,由于未修改数组,所以我宁愿这样
HsInt32 foo(const HsPtr a1, HsInt32 a2);

有没有一种方法可以自动添加此注释?

(动机是我希望通过一个std::vector
inline int foo(const std::vector<int> &v)
{
  return foo(v.data(), v.size());
}

不包含const_cast。)

最佳答案

GHC中没有使用const注释生成C帮助程序功能的功能。特别是,GHC源中的相关代码在compiler/deSugar/DsForeign.hs函数mkFExportCBits中,该函数生成C存根。每个参数都有一个未经修饰的C类型,该类型由前缀“Hs”和构造函数的名称组成。无法在任何地方添加const

甚至没有希望让GHC使用用户定义的C类型,例如可以使用的HsConstPtr:允许将外来参数的类型限制为boxedMarshalableTyConcompiler/typecheck/TcType.hs函数所确定的类型(以及C中的C类型的相关定义) includes/HsFFI.h)。

另一方面,目前尚不清楚为什么不能只放弃正在编写的包装器中的const:

inline int foo_wrapper(const std::vector<int> &v)
{
  std::vector<int> &v2 = const_cast<std::vector <int>&>(v);
  return foo_haskell(v2.data(), v2.size());
}

如果那让您感到肮脏……那么,编程就是肮脏的生意,对吧?

关于c++ - Haskell FFI导出的const批注,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43974886/

10-13 08:20