【问题标题】:How to pass CString to CVarArg?如何将 CString 传递给 CVarArg?
【发布时间】:2014-06-13 19:25:32
【问题描述】:

更新:这个问题不再相关,因为 CString 已在 Xcode 6 beta 4 中删除。


在 C 语言中,我可以将 C 字符串 (const char *) 传递给接受可变参数的 C 函数。

现在我想在给定CString 的情况下在 Swift 中做同样的事情。我知道在 Swift 中我不能直接访问 C varargs 函数,但是我可以访问带有 va_list 的 C 函数,在 Swift 中它变成 CVaListPointer,我可以使用 getVaList()CVarArg 的数组中实现它,根据this question

我可以成功地将整数 (Int) 和对象 (NSObject) 放入 CVarArg 数组中,但我不知道如何将 CString 放入 CVarArg 中。

查看标准库中符合CVarArg 的类型,我看到有一个COpaquePointer,但我也不知道如何将CString 放入其中。

【问题讨论】:

    标签: swift variadic-functions


    【解决方案1】:

    以下似乎编译为将 CString 放入 COpaquePointer :

    var myStr : CString = "foo"
    var myStrPointer:CMutablePointer<CString> = &myStr
    myStrPointer.withUnsafePointer { (myPtr1 : UnsafePointer<CString>) -> () in
      let myOpaquePtr = COpaquePointer(myPtr1)
    }
    

    【讨论】:

    • 我不确定这是否可行,CString 可能已经是指针。也许最好先获得String,然后使用withCString { ...} 获得UnsafePointer&lt;CChar&gt;
    • 你确定这不是指向栈上变量myStr的指针吗?
    【解决方案2】:

    这是在 beta 3 上测试的:

    let myString = "abc123"
    let myStringC = myString.cStringUsingEncoding(NSUTF8StringEncoding)!
    
    myStringC.withUnsafePointerToElements {
        (myStringPtr: UnsafePointer<CChar>) -> () in
        var varargs = [COpaquePointer(myStringPtr)]
        let va_list = getVaList(varargs)
        // Use va_list...
    }
    

    【讨论】:

    • 这段代码中没有CStringmyStringStringmyStringC[CChar]。虽然我可以从CStringString.fromCString() 获得String,但您从StringUnsafePointer 的过程比直接使用withCString 要长得多,正如Sulthan 的评论所暗示的那样。
    • 一个 C 字符串和一个 C 字符数组是一回事。我测试了 Sulthan 建议的 withCString 方法,它没有工作,但是 YMMV,我可能只是在测试时搞砸了。
    • CString[CChar] 在 Swift 中是完全不同的类型。为什么不尝试从CString 类型的变量开始?
    猜你喜欢
    • 2014-03-09
    • 2011-09-30
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2021-01-14
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多