Swift中如何获取对象的UnsafeRawPointer及C++多参数接口调用问题
问题1:单独使用
&obj报错的原因 - Swift中的
&不是通用的取地址运算符,它仅作为inout参数传递标记存在,仅允许在两种场景使用:- 调用参数标注为
inout的Swift函数时,放在实参前标记传递引用 - 调用导入到Swift的C/C++/Objective-C函数时,如果参数是指针类型,编译器提供语法糖,允许用
&直接将变量转换为对应类型的指针传入函数
- 调用参数标注为
- 你直接写
var pointer = &obj不属于上述两种合法场景,编译器没有对应语法支持,因此抛出「Use of extraneous '&'」错误。
额外注意:如果MyCustomObj是类(引用类型),你用&obj传给C的void*实际传递的是「指向对象指针的指针」,而非对象本身的内存地址。如果C侧需要的是对象实例的地址,你需要用Unmanaged转换:
let objPtr = Unmanaged.passUnretained(obj).toOpaque() foo(objPtr)
如果MyCustomObj是结构体/枚举等值类型,&obj传递的就是值本身的内存地址,符合常规预期。
问题2:多指针参数的写法是否正确
你写的嵌套withUnsafePointer写法是完全正确的:
withUnsafePointer(to: myObjFirst) { pFirst in withUnsafePointer(to: myObjSecond) { pSecond in foo(pFirst, pSecond) } }
withUnsafe*系列方法返回的指针仅在闭包的执行周期内有效,嵌套写法可以保证两个指针的生命周期都覆盖到foo的调用过程,内存安全合规。
如果你的项目支持Swift 5.7及以上版本,可以用更简洁的非嵌套写法:
withUnsafePointers(to: myObjFirst, myObjSecond) { pFirst, pSecond in foo(pFirst, pSecond) }
内容的提问来源于stack exchange,提问作者Sirop4ik
相关产品推荐
相关产品推荐

