【发布时间】:2011-09-02 16:16:23
【问题描述】:
我想将严格的 ByteStrings 从 Haskell 转换为 C++ 的 std::string 以通过 the FFI 将其传递给 C++ 库。由于ByteString 可能包含NULL 字符,因此转换为CString 作为中间步骤是不可行的。这里的正确方法是什么?
当前解决方案
感谢到目前为止的回答。我希望该任务有一个规范的解决方案,但也许它还不存在:)
一些c++ library documentation 说如下:
字符串 ( const char * s, size_t n );
内容被初始化为由 s 指向的字符数组中的前 n 个字符组成的字符串的副本。
因此可以编写这样一个函数,从 ByteString 复制一次以构造 std::string
foreign import ccall unsafe toCCString_ :: CString -> CUInt -> IO (Ptr CCString)
toCCString :: ByteString -> IO (Ptr CCString)
toCCString bs =
unsafeUseAsCStringLen bs $ \(cstring,len) ->
toCCString_ cstring (fromIntegral len)
toCCString_ 附带的 C++ 代码看起来就像 Neil 和 Alan 指出的那样。
【问题讨论】:
-
我们需要远更多关于您打算如何连接这两种语言的信息。
-
我稍微编辑了我的问题,但我不确定你的意思是什么信息。
-
“通过 FFI”是我们需要的。
-
对不起,我之前编辑过“
CString”。当时不知道这是一个具体的事情。已恢复。