如何解决为什么当静态不存在时,常量会在链接过程中消失?
use super::*;
static BLANK_VEC: [u8; 16] = [0_u8; 16];
pub fn pad(name: &'static str) -> String {
let mut res = String::from(name);
res.push_str(&String::from_utf8_lossy(&BLANK_VEC[name.len()..]));
res
}
当我将其链接到 C 代码时,它会按预期工作,但是如果我与以下代码链接(唯一的区别是 const
而不是 static
),标签 BLANK_VEC
不会t 出现在 ELF 文件中。它可以编译并运行,直到出现 HardFault。
use super::*;
const BLANK_VEC: [u8; 16] = [0_u8; 16];
pub fn pad(name: &'static str) -> String {
let mut res = String::from(name);
res.push_str(&String::from_utf8_lossy(&BLANK_VEC[name.len()..]));
res
}
这是 Rust 方面的错误吗?我认为是因为 const
变量以某种方式超出了范围。我可以参考它并编译它。哪里有保证的内存安全?为什么我不必使用 unsafe
块来做到这一点?
如果这取决于我的链接器:我使用 arm-gcc-none-eabi
。
编辑:我理解为什么会发生这种情况,但 Rust 不应该确保用户使用不会消失的变量吗?
解决方法
这不是 rust 中的错误:const
定义了在每个使用站点复制的常量 值(因此在运行时不存在)。
static
定义了一个全局变量(它可能是也可能不是常量),因此出现在最终程序中,它是内存中的一个实际位置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。