gpt4 book ai didi

c++ - Haskell FFI 导出的 const 注释

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:33 24 4
gpt4 key购买 nike

我将一个 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< int > 运行

inline int foo(const std::vector<int> &v)
{
return foo(v.data(), v.size());
}

不包括 const_cast。)

最佳答案

GHC 中没有用于生成带有 const 注释的 C 辅助函数的工具。特别是,GHC 源代码中的相关代码位于生成 C stub 的 compiler/deSugar/DsForeign.hs 函数 mkFExportCBits 中。每个参数都被赋予一个由前缀“Hs”和构造函数名称组成的未经修饰的 C 类型。无法在任何地方添加 const

甚至没有希望让 GHC 使用用户定义的 C 类型,例如您可以使用的 HsConstPtr:允许的外部参数类型仅限于由 确定的类型compiler/typecheck/TcType.hs 中的 boxedMarshalableTyCon 函数(以及 includes/HsFFI.h 中 C 类型的相关定义)。

另一方面,不清楚为什么你不能在你正在编写的包装器中丢弃常量:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com