- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个 Rust 库。我听说过 no_std
功能,并注意到我的库没有使用 std
中 core
未提供的任何内容和 alloc
.所以理论上我可以只添加 #![no_std]
属性并更改一些导入。
但我想知道这对我图书馆的用户有何影响。当然,我希望通过使用 #![no_std]
,no_std
环境中的用户也可以使用我的 crate。那当然很好。但是:我的库的用户是否因为我的库是 no_std
而有任何缺点?例如,他们是否被迫也使用 #![no_std]
?那会很糟糕。我想知道,因为大多数 crate 隐藏了 Cargo 功能背后的 no_std
兼容性。我实际上在网上找不到关于这个问题的任何信息。
如果使用#![no_std]
没有任何缺点,那么每个可以在没有std
的情况下工作的 crate 都应该添加该属性,对吧?
最佳答案
For example, are they forced to also use
#![no_std]
?
完全没有。依赖包(即,将使用您的包的包/项目)将知道找到您的依赖项所需的 core
包,并且可以像 no_std 一样自由使用它
曾经参与过。主要区别在于对这种依赖的期望以及有多少其他 crate 可以使用它。换句话说,如果该依赖项是为 no_std
准备的,那么与您的依赖项兼容的 crate 集应该始终是一个超集。
readme of KodrAus/rust-nostd ,一个在库中使用和测试 no_std
的示例,还建议尽可能使用 no_std
以获得最大兼容性:
The current design of Rust's standard library is split into a few layers, each building on the assumed platform capabilities of the one below. There's:
std
: the full standard library assumes the presence of threads, a filesystem, and networking. [...]alloc
: the collections layer builds on the core by assuming runtime support for dynamic memory allocation.core
: the core layer makes no (well, not very many) assumptions about the > underlying platform. Just about any target that can run Rust code is supported by core.So when you're designing your library you can make it maximally portable by targeting the lowest layer of the standard library that you can.
一些 crate 将 no_std
放在 Cargo 特性后面的原因是因为 crate 可能包含一些需要 std
的选择加入功能,或者至少 分配
。通过以 Cargo 功能为条件,没有标准库的环境仍然可以使用 crate,而那些具有 std
或 alloc
的环境可以使用 crate 的扩展 API。下面是显示此功能的“lib.rs”示例。
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
extern crate core;
#[cfg(feature = "alloc")]
extern crate alloc;
pub fn foo_into_slice(slice: &mut [u8]) { unimplemented!() }
/// Vec requires alloc
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
#[cfg(feature = "alloc")]
pub fn foo_into_vec(vec: &mut Vec<u8>) { unimplemented!() }
关于rust - 将 `#![no_std]` 添加到库时,该库的用户是否有任何缺点或复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611219/
我有一个存储指向某些数据的原始指针的结构: struct Foo { x: *const T } impl Foo { fn new(x: &[T]) -> Foo {
我想做这样的事情: let x = 123; let mut buf = [0 as u8; 20]; format_to!(x --> buf); assert_eq!(&buf[..3], &b"
如何在不使用 std 的情况下实现以下示例? let text = format!("example {:.1} test {:x} words {}", num1, num2, num3); tex
我想做这样的事情: let x = 123; let mut buf = [0 as u8; 20]; format_to!(x --> buf); assert_eq!(&buf[..3], &b"
我写了一个 Rust 库。我听说过 no_std 功能,并注意到我的库没有使用 std 中 core 未提供的任何内容和 alloc .所以理论上我可以只添加 #![no_std] 属性并更改一些导入
我正在开发一个使用 #![no_std] 的项目,我希望能够派生出有用的特性,例如 Copy 和 Clone 。我尝试将 pub use core::prelude::*; 添加到项目根目录和我实际想
我正在为 Rust 中的编程语言实现编写运行时。我计划在这个运行时中链接我生成的编译代码,所以为了保持二进制文件小我不想依赖 std . 当我尝试 cargo test我的运行时,我收到错误提示 st
在标准的 Rust 代码中,vec! 宏位于序曲中,无需手动使其可见。我正在开发一个不使用标准库并设置 #![no_std] 的库,因此前奏也不可见。 在测试代码中,我使用了标准库中的功能,因此我有一
我正在尝试使用 #![no_std] 集编写一些 Rust。我试图一次遍历 str 一个字符;然而,通常的技术似乎都不起作用。当我尝试通过 str 提供的函数访问字符时,例如for c in s.ch
我想在带有 no_std 的 crate 中使用 Box。这可能吗?到目前为止,我的简单尝试都没有奏效。 这个编译(但使用标准库): fn main() { let _: Box = Box:
我正在尝试建立一个与 dueboot 非常相似的项目.即嵌入式 ARM 上的 Rust。现在,我只能编译 Rust 代码,但无法编译。 我基本上完全从那个项目中复制了 rust 代码,但是我并不完全理
我正在尝试在 Tock OS 嵌入式操作系统上实现 future 。我正在尝试使用 Tokio在 #[no_std] 环境中。 我的 Cargo.toml 文件如下所示: [package] name
我想启动一个Rust no_std项目,所以我只是创建了一个新的商品包,并在main.rs中写了以下几行: #![feature(lang_items, start)] #![no_std] exte
我对无堆链表的尝试缺少什么? 我的目标是让下面的代码在堆栈上生成序列 [1, 2, 3],然后在单独的行上打印这些值 ,而不使用 Box 或其他任何东西需要堆或 std 或 malloc。 我浏览了
我正在尝试使用 GCC 6.1.0 和 rustc 1.11 在 Windows 中使用 C 语言构建一个调用 Rust 函数的最小程序,最好使用 #![no_std] 编译。 0-nightly (
我正在尝试使用rand或rand_core生成随机数。根据the documentation,可以使用#![no_std]启用default-features = false用法。因此,我尝试对ran
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
this question的所有答案关于将数组从 C 传递给 Rust 使用 std::slice::from_raw_parts将原始 C 指针和一些长度信息转换为 Rust。在嵌入式上下文中(在我
我正在尝试创建一个嵌入友好的可执行文件(占用空间小,不依赖于 Rust 标准库),它使用一个已经支持 no_std 构建的库 (wasmi)。 Rust 的新手,我只是将指令拼凑在一起,但它的要点似乎
我是一名优秀的程序员,十分优秀!