Skip to main content
 首页 » 操作系统

swift之将 swift 结构的地址转换为特定类型的 C 指针

2024年01月01日41lonelyxmas

我试图了解将 swift 中的结构地址转换为特定类型的 C 指针的正确方法是什么。这是我正在尝试做的事情:

我有一个 C 函数接受这样的指针(C 代码):

myFunc(u8* data, u8 lengthOfData); 

(注意:u8 定义为无符号字符)

我想从 swift 向这个函数传递一些东西,这里有:

let someData = SomeStruct(someValue: 1) 
myFunc(&someData, sizeof(SomeStruct)) 

自然地,swift 编译器会提示:

'someData' is not convertible to '@lvalue inout $T3' 

我认为这是因为它缺少对 u8* 的转换,就像在 C 中一样,我会这样称呼我的乐趣:

myFunc((u8*)&someData, sizeof(SomeStruct)); 

我在 swift 中尝试了以下操作:

UnsafePointer<u8>(&deviceInfo) 
&deviceInfo as UnsafePointer<u8> 

但两者都不编译。

那么如何正确转换指针类型呢?

谢谢。

请您参考如下方法:

如果您将结构声明为变量

var someData = SomeStruct(someValue: 1) 

然后你可以使用 withUnsafe(Mutable)Pointer() 来获取一个指针:

withUnsafeMutablePointer(&someData) { 
    myFunc(UnsafeMutablePointer($0), UInt8(sizeof(SomeStruct))) 
} 

这保证指针只在结构被调用时使用 有效。

如果 C 函数接受一个常量指针

 myFunc(const u8* data, u8 lengthOfData); 

那么你不需要可变指针:

withUnsafePointer(&someData) { 
    myFunc(UnsafePointer($0), UInt8(sizeof(SomeStruct))) 
} 

但请注意,Swift 结构的布局未定义,可能 改变。对于 Swift 和 C 都需要的数据结构,它可能是 将它们定义为 C 头文件中的 C 结构更安全。