微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么当静态不存在时,常量会在链接过程中消失?

如何解决为什么当静态不存在时,常量会在链接过程中消失?

我的静态库包中有一个这样的函数

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 举报,一经查实,本站将立刻删除。