写这样的图书馆我会牺牲性病吗?例如,如果可能的话,我将如何向rust库编写python绑定?

推荐答案

首先,向Rust指出您想要创建一个对C可见的函数:

#[no_mangle]
pub extern "C" fn some_func() { ... }

这告诉Rust避免损坏输出符号并使用C ABI.

接下来,在跨越边界时,需要使用C兼容的类型.以下是一些对我有用的建议:

  • 如果您计划将一个Rust struct 作为不透明数据传递给C,它会将其传递回其他函数,将其作为Box<T>返回,并将其作为&TBox<T>.本质上,这意味着你放弃了Rust中 struct 的所有权,并将所有权赋予了C代码.C代码必须确保,如果它将指针传递回一个接受一个框的函数,它将返回no longer uses it.
  • 如果您计划将一个Rust struct 作为C struct 传递给C,Rust可以方便地以C兼容的方式表示其 struct .但是,您需要将您在这些 struct 中输入的值的类型限制为也具有兼容的C表示形式的类型.当然,数字类型和布尔值是安全的.
  • core::raw以下的文档中,可以看到更复杂类型(如vec和string)的 rust 迹表示.&str&[T]表示为raw::Slice,而Vec<T>表示为raw::Vec.
  • 您还可以将类型转换为libc::types
  • 最后,您可能会发现自己需要直接使用指针.查看std::mem个有用的API.

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

如何使用Match比较 struct 中的值

如果LET;使用布尔表达式链接(&Q);

如何格式化传入Rust中mysql crate的Pool::new的字符串

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

使用Box优化可选的已知长度数组的内存分配

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

Rust编译器似乎被结果类型与anyhow混淆

不同类型泛型的映射

为什么我们有两种方法来包含 serde_derive?

`tokio::pin` 如何改变变量的类型?

我什么时候应该使用特征作为 Rust 的类型?

在运行时在 Rust 中加载字体

Rust 将特性传递给依赖项

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

有没有办法阻止 rust-analyzer 使非活动代码变暗?

当用作函数参数时,不强制执行与绑定的关联类型

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

如何在 Rust 中使用特征标志来捕获多行代码?