gpt4 book ai didi

rust - 如何将一片特征对象传递给C

转载 作者:行者123 更新时间:2023-12-03 11:30:29 26 4
gpt4 key购买 nike

我最近一直在研究一个库,我想为它做 C 绑定(bind)。这个库中的一个结构体向用户返回了一个特征对象的片段。这是函数定义的样子:

pub fn controllers(&self) -> &[Box<dyn Controller>] {
&self.controllers
}
我不确定如何翻译这个。 C 代码将 不是 在这些动态对象内部戳。它只会将它们传递回 rust 代码,即
pub fn controller_get_name(controller: *const dyn Controller) -> *const c_char {
let controller = controller.as_ref();
controller.get_name().as_ptr();

}
目前,我有这个:
#[no_mangle]
pub extern "C" fn libvibrant_instance_get_controllers(instance: *mut Instance,
mut controllers: *const dyn Controller,
len: *mut usize) {
assert!(!instance.is_null());
assert!(!len.is_null());

let instance = unsafe { instance.as_ref().unwrap() };
controllers = instance.controllers().as_ptr();
unsafe {
*len = instance.controllers().len();
}
}
但显然,这不起作用,因为 as_ptr正在返回 *const Box<dyn Controller>而不是 *const dyn Controller .我可以在这里做什么?

最佳答案

在编写 C 绑定(bind)时,应该从 C 端考虑,要提供哪些操作,尽可能隐藏实现。
例如,您说 C 代码将使用 trait 对象回调 Rust;并且您似乎想将它们作为(指针,长度)对传递给 C,以便 C 可以迭代它们。但是,这意味着 C 需要知道每个特征对象有多大(比单个指针大;对于共享切片也是如此)。
相反,我会为集合和关联函数提供一个不透明的句柄来迭代它。只有当性能非常重要时,我才会让 C 知道每个元素的大小(这意味着 ABI 将取决于 Rust 如何表示 DST)。
有关技术细节,请查看 What is a “fat pointer” in Rust? 等问题。 .

关于rust - 如何将一片特征对象传递给C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65590737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com