C Rust静态函数fn指针,初始化哪个值?

C Rust静态函数fn指针,初始化哪个值?,c,rust,C,Rust,我正在尝试创建一个可从C调用的Rust库: 使用std::os::raw:{c_int}; 类型OnDataCallback=unsafe extern“C”fn(数据:*mut u8,len:usize)->C_int; 静态mut-onDataCallback_u2;:onDataCallback=std::ptr::null(); #[没有损坏] 发布外部“C”fn注册数据回调( 数据:*常数u8,len:usize, cb:选项)->c_int { onDataCallback_uxB=

我正在尝试创建一个可从C调用的Rust库:

使用std::os::raw:{c_int};
类型OnDataCallback=unsafe extern“C”fn(数据:*mut u8,len:usize)->C_int;
静态mut-onDataCallback_u2;:onDataCallback=std::ptr::null();
#[没有损坏]
发布外部“C”fn注册数据回调(
数据:*常数u8,len:usize,
cb:选项)->c_int
{
onDataCallback_uxB=cb.unwrap();
返回0;
}
#[没有损坏]
酒吧外部“C”fn doSomething()
{
不安全{onDataCallback(mut“hello world”,100)};
}
但我得到了:

-->接口。rs:5:46
|
5 |静态mut-onDataCallback|:onDataCallback=std::ptr::null();
|^^^^^^^^^^^^^^^^^^^^^应为fn指针,已找到*-ptr
|
=注意:预期的fn指针`不安全的外部“C”fn(*mut u8,usize)->i32`
找到原始指针“*const”_`
我不知道初始值应该放在哪里。我不能让它没有一个,我不能把空。我应该放什么


如果我现在做的是一个不好的练习,请给我一个好的。我是Rust的新手。

您应该将它包装在
选项中
并用
初始化它

static mut onDataCallback_: Option<OnDataCallback> = None;
static mut-onDataCallback\uux:Option=None;

您可以使用一个函数对其进行初始化,该函数将:

static mut ON_DATA_CALLBACK:OnDataCallback=init;
外部“C”fn init(:*mut u8,:usize)->C\u int{
死机!(“函数指针未初始化”);
}
请注意,
静态mut
非常不安全,通常不鼓励使用它,因为正确使用它非常困难。安全的替代方法是在
静态
中使用
RefCell
Mutex
。由于
互斥体
具有内部可变性,因此
静态
不需要是可变性的

更好的解决方案是在第一次调用
doSomething()
时使用或初始化该函数


顺便说一下,Rust字符串文本总是不可变的。通过分配
字符串
,可以获得可变字符串。看。

我认为这是不可能的。也许是谢谢之类的。这是最好的方法吗?我不得不设置不安全:
unsafe{onDataCallback_=cb;}
否则它将无法工作。
static mut
几乎从来都不是最好的方法<代码>单元格包装在
线程\u本地
Mutex
封装在
lazy\u static
中(取决于您是否需要线程安全)几乎总是更好。