Swift 缺少 属性 来自结构中的 C 灵活数组成员?

Swift missing property from C Flexible Array Member in Struct?

我 运行 遇到了与 解释的完全相同的问题。不幸的是,我不明白到底做了什么改变来解决这个问题。 OP 是否提示 Swift 灵活数组成员的大小以使其在 Swift 中可见? OP是否修改了C库?我想避免这样做。

我在 Swift 中使用了一个 C 库,returns 一个结构的末尾有一个灵活的数组成员 "mbody"。

typedef struct {
    size_t size;
    char mbody[];
} msg

在 Swift 中,当返回此结构时,我可以访问 属性 "size",但不能访问 属性 "mbody"。我已经确认 mbody 设置正确。初始化 C 结构的代码的简化版本在这里:

    const size_t mem_size = msgcount * MSGBOX_SIZE;
    msg* ret = malloc(sizeof(msg) + mem_size);

    if (!ret)
        return NULL;

    ret->size = mem_size;
    memcpy(ret->mbody, msgrecord, MSGBOX_SIZE);

为什么 Swift 没有获取 msg->mbody 的大小?它是编译器设置吗?我把它设置为C99。

我还没有找到解决这个问题的正确方法,但如果它从未得到解答,我确实找到了解决方法。我可以访问 ret 的指针并通过使用 ret->size 读取整个内存,然后前进到 mem_size 的大小。我意识到那里可能有一个正确的解决方案,这个解决方案可能仍然有一个额外的不必要的步骤(高级),但我还没有弄明白。

let size = retPointer.pointee.size
let msgRaw = Data(bytes: retPointer, count: (MemoryLayout<msg>.stride + size))
let msgBody = msgRaw.advanced(by: MemoryLayout<Int>.stride) 

相反,我的解决方法并不完美,但有效。如果有人能展示在 Swift 的结构中处理 C 灵活数组成员的正确方法,我仍然会很感激。在我的解决方法中,我计算需要多少 msg 对象才能为正文创建足够长的缓冲区,然后复制到那个 space.

let totalmem = (mem_size + MemoryLayout<Int>.stride) / MemoryLayout<msg>.stride
let max = Int(ceil(Double(totalmem)) + 1.0)
withUnsafeMutablePointer(to: &msgObj) { orderPtr in
    orderPtr.withMemoryRebound(to: msg.self, capacity: max){ reboundPtr in
        let bodyPtr = UnsafeMutableRawPointer(reboundPtr).advanced(by: MemoryLayout<Int>.stride)
        let bodyBufferPtr = UnsafeMutableRawBufferPointer(start: bodyPtr, count: mem_size)
        body.copyBytes(to: bodyBufferPtr)
    }
}