如何在rust中声明一个公共静态指针?[副本]

w9apscun  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(136)

此问题已在此处有答案

How do I create a global, mutable singleton?(8个回答)
昨天关门了。
我只是想声明一个指向crate中的结构体的指针,该crate由项目的几个组件共享,但使用相同的进程。我的意思是,目标是让它只初始化一次。

type Box = [u64; 64];
pub static mut mmaped: &mut Box;

在编译时generated this error

free static item without body

其中,mmaped稍后仅从顶部板条箱中以以下方式分配一次值,并且其值从其所依赖的多个板条箱中使用。

mmaped = unsafe { std::mem::transmute(addr) };

那么,如何提供mmaped的定义,而不必多次定义mmap
这个问题不是How do I create a global, mutable singleton?的重复,因为它没有讨论将单例导出到crate之外,并且我得到了一个编译器错误。

vxf3dgd4

vxf3dgd41#

Rust编译器(2018)无法从代码生成有效的静态项,因为它缺少主体。您试图声明一个静态变量mmaped,但实际上没有使用任何值初始化它。所有静态变量必须在编译时初始化。
std::mem::MaybeUninit似乎是这个用例的完美解决方案。使用“未初始化”值初始化它。稍后用实际值更新它。因为它是静态的,所以不允许进一步的初始化。

use std::mem::MaybeUninit;
type Box = [u64; 64];
pub static mut mmaped: MaybeUninit<Box> = MaybeUninit::uninit();

// later
unsafe {
    mmaped = MaybeUninit::new([0; 64]);
}

只要确保在实际初始化之前不要访问mmaped即可。

相关问题