将 Rust 特征传递给 C

2023-12-22

我正在构建一个 Rust 库,需要使用 Rust 对象调用一些 C 函数。我有一个调用 C 函数的函数的特征,C 函数在 Rust 中定义如下:

extern {
    fn process_trait(my_trait: MyTrait);
}

这个想法是,用户可以为其结构实现特征,然后调用 C 函数(基本上,C 然后调用其他一些 Rust,它调用一些 Trait 函数)。这里的错误是:the trait core::marker::Sized is not implemented for the type Self,因为我正在路过*self到 process_trait。难道我做错了什么?我尝试对此进行一些更改,甚至进行强制转换,但我收到此错误或错误的类型。

我认为问题在于它应该是堆分配的,不是吗?我唯一想避免的是 API 看起来很丑。用户应该能够

struct MyUnit;
impl MyTrait for MyUnit...
MyUnit.callC();

按值传递特征对象没有意义,尤其是在与 C 交互时。实际类型(在 C 意义上)及其大小未知,并且对象内部没有 vtable。您很可能想要传递特征引用(&MyTrait)。 然而,特征对于 C 来说是陌生的,因此会产生糟糕的接口。虽然您可以定义相当于core::raw::TraitObject在 C 语言中,实际上用 vtable 做任何事情都是极其丑陋、脆弱和不安全的。

如果您需要跨 Rust-C 屏障的多态性,显式函数指针是一个不错的选择much更好的选择。你仍然可以拥有MyTraitcallC方法,只是 FFI 部分看起来不同。可以将对象作为有效负载传递给 C 库回调。

或者,绕过上述TraitObjects(胖指针),但永远不要从 C 中检查它们,通过 Rust 中的(非特征)辅助函数调用方法:

extern fn call_method(obj: TraitObject) {
    let obj: &MyTrait = transmute(obj); // should be safe, but not tested
    obj.meth();
}

这避免了在 C 中手动挖掘 Rust vtable 的麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Rust 特征传递给 C 的相关文章

随机推荐

  • 如何在 Python 中进行 Obj-C 类别?

    Obj C 我已经很长时间没有使用它了 有一个叫做类别 http macdevelopertips com objective c objective c categories html来延长课程 用新方法声明一个类别并将其编译到您的程序中
  • 如何在 Objective c 中获取当前月份的日期?

    我正在开发一个使用日期 月份 年份的应用程序 我想要当前月份的日期 因为当前月份可以有 28 29 30 31 天 我试图获取当年的月份 但我不知道上面的代码 这是我的代码 NSDateFormatter dateFormatter NSD
  • 使用 ApplicationDbContext 的身份脚手架

    ASP NET Core 2 x 现在将身份页面和逻辑隐藏在库内 为了延长IdentityUser具有新属性的实体并添加 UI 和逻辑来处理这些新属性 我们现在可以运行 身份脚手架 在 MyProject gt 添加 gt 新脚手架项下 很
  • 动态启用/禁用 jquery 可排序项目

    我的表格行可以根据是否选中某些单选按钮进行排序 可排序对象初始化于document ready如下 document ready function Return a helper with preserved width of cells
  • django 中是否有像 Rails 中那样的 before_filter ?

    django中有没有可用的功能 以便我们可以在django视图中对所有操作进行一些过滤 例如rails中可用的 before filter 我仍在学习 Rails 但从我到目前为止观察到的来看 python装饰者 http en wikip
  • GameCenter:endTurnWithNextParticipants 未前进

    在沙盒环境中 我无法将回合制比赛推进到下一个玩家 初始条件 玩家 A 和玩家 B 分别位于设备 A 和设备 B 上 两者都登录到沙箱 双方玩家都可以看到对方的GC状态信息 玩家 A 创建一场比赛并邀请玩家 B 玩家A结束回合 在我的 结束转
  • Tensorflow 错误:FailedPeconditionError:尝试使用未初始化的变量

    我想将立体图像放入优化器中 这是我的代码 tf reset default graph config learning rate 0 5 training epochs 5 init init tf global variables ini
  • 如何动态地将组件作为子组件添加到指令中?

    我一直在尝试 Angular 2 并且我已经能够通过获取现有子组件的 ViewChild 然后使用 ComponentResolver 添加我的动态组件来动态地将一个组件添加到另一个组件的子组件中 但是 如果您无法控制模板 即您动态地将组件
  • 堆叠两个具有不同列名的 SQL 表 (2008)

    我检查了这个网站的代码来堆叠两个表 将一个表的结果放在另一个表的结果下面 其中列名不同 我知道当名称相同时 UNION ALL 可以工作 并且我知道当一个表比另一个表拥有更多信息时 对一个表中缺少的列名进行赋值的 UNION ALL 可以工
  • 在 R Markdown 中跳转到某个块的快捷方式?

    是否有跳转到 R Markdown 中的某个块 在 Mac 上 的快捷方式 我正在寻找一种快速从一个块到另一个块的方法 我不完全确定这在 Mac 上是否可行 但在 Windows 版 RStudio 中 您可以选择在 IDE 中显示 文档大
  • 在nodejs中获取视频分辨率

    我一直试图找到这个问题的答案 但没有真正找到答案 如果这听起来很愚蠢或显而易见 请原谅 我有一个 Nodejs 应用程序 基本上我想简单地获取视频的分辨率 想象一下 我在磁盘上存储了一部影片 我希望能够知道它是 720p 还是 1080p
  • 如何检查Android中的UI线程是否运行? [复制]

    这个问题在这里已经有答案了 如何知道正在运行的代码是否在主线程 UI线程 上执行 对于 Swing 我使用isEventDispatchThread方法 使用Looper getMainLooper getThread 获取UI线程 您可以
  • HTTP_INTERCEPTORS 的 multi: true 属性是什么意思?

    我是 Angular 的新手 刚刚构建了一个拦截器 根据多个教程 您必须包括HTTP INTERCEPTORS in the app module像这样 providers provide HTTP INTERCEPTORS useClas
  • 图像路径在 Angular 2 中不起作用

    我放在网站上的所有内容都可以正常运行 但是我尝试放入网站的每个图像 背景除外 都会返回一个404 Not Found Error 我的所有图像都位于 Project src assets images 并且我在 html 文档中尝试了以下
  • vim 用红色突出显示所有内容

    我在执行脚本时向 python 脚本添加了一条打印行 现在当我打开文件时 所有文本都以红色突出显示 打开和关闭文件并不能消除它 打开第二个 python 文件暂时解决了问题 但随后关闭文件并重新打开又使问题再次出现 现在它根本不会消失 有谁
  • 捕获 subprocess.run() 的输出并实时打印它?

    我想使用运行命令subprocess run 然后将其 stdout stderr 作为字符串获取 但我希望子进程在运行时也能正常将其输出打印到控制台 如果我做 result subprocess run ls al 然后我可以看到打印到控
  • OpenMP 和 MPI 哪个更容易学习和调试?

    我有一个数字处理 C C 应用程序 它基本上是不同数据集的主循环 我们可以访问具有 openmp 和 mpi 的 100 个节点集群 我想加快应用程序的速度 但我对 mpi 和 openmp 来说都是绝对的新手 我只是想知道即使性能不是最好
  • XNA 可编辑文本字段

    我知道如何在 XNA 中绘制文本 但我正在实现一个关卡设计器 它需要用户在 UI 中输入文本 我在 Google 上搜索了一下 但找不到如何实现可编辑的文本字段 框架中没有为此构建任何内容吗 你可以使用某种 gui 库 例如http nuc
  • WPF 工具包 DatePicker 仅月/年

    我正在使用上述工具包的日期选择器 但我想将其限制为仅选择月份和年份 因为在这种情况下 用户不知道或不关心确切的日期 显然 数据存储在日期时间中格式将存储日期 但这与我无关 有没有一种简单的方法可以解决这个问题 Thanks 感谢 Ferna
  • 将 Rust 特征传递给 C

    我正在构建一个 Rust 库 需要使用 Rust 对象调用一些 C 函数 我有一个调用 C 函数的函数的特征 C 函数在 Rust 中定义如下 extern fn process trait my trait MyTrait 这个想法是 用