我将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
:允许将外来参数的类型限制为boxedMarshalableTyCon
中compiler/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/