在 Swift 中,当调用 C 函数时,Swift 字符串作为参数传递时会自动强制转换为 CString。但是,在填写 C 结构体或全局变量时,我没有得到相同的行为。
strlen(swiftString) //Works!
CGlobalStruct.stringPtr = swiftString //Doesn't work!
首先,为什么当它们都是“const *char”时它们的行为不同。其次,填写 C 结构体最简洁的方法是什么?
A Swift String
可以作为参数传递给函数
AUnsafePointer<Int8>
范围。编译器生成 Swift 字符串的临时表示
作为 NUL 终止的序列char
并传递一个指针到
该函数的 C 字符串。表示形式和指针是仅在函数调用期间有效。这就是发生在
strlen(swiftString)
当分配一个全局C字符串指针时,你必须采取
考虑此指针的生命周期。一种可能性是
let swiftString = "Hello world"
swiftString.withCString {
CGlobalStruct.stringPtr = $0
// Pointer valid inside this closure ...
}
// Pointer not valid anymore ...
其中指向 C 字符串表示形式的指针被传递给闭包。
该指针(仅)在闭包执行期间有效。
为了延长使用寿命,您可以allocate内存中的 C 字符串,
但最终你有责任释放该内存:
guard let cStringPtr = strdup(swiftString) else {
fatalError("strdup failed")
}
CGlobalStruct.stringPtr = UnsafePointer(cStringPtr)
// ...
free(cStringPtr)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)