如何在Rust FFI中访问C全局变量/常量?

Kor*_*nel 3 c ffi rust

我需要访问从Rust中的C导出的常量的值。

我想从实际符号中读取值,而不仅仅是将其复制并粘贴到Rust(在我的情况下,该值是一个指针,而C检查指针是否相等)。

extern void *magic;
Run Code Online (Sandbox Code Playgroud)

magic: *const c_void在Rust中可读的语法是什么?

Kor*_*nel 5

use std::os::raw::c_void;

extern "C" {
    #[no_mangle]
    static magic: *const c_void;
}
Run Code Online (Sandbox Code Playgroud)

可选,前extern有可能#[link(kind="static", name="<c library name>")]得到的实际符号链接。

常量声明为staticconst这有点奇怪,但是使用关键字时,它会失败,并且“外部项目不能为const”。¯\ _(?)_ /¯

  • const和static在Rust和C中的含义不同。Rust的static定义该值具有地址,而const没有。在这种情况下,const更接近于C #define。复习[本书第一版中的“ const”与“ static”一章](https://doc.rust-lang.org/stable/book/first-edition/const-and-static.html)以了解更多。 (5认同)