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

6

我需要访问从C导出的常量的值,并在Rust中使用。

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

extern void *magic;

什么是用于Rust的使magic: *const c_void可读的语法?
1个回答

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

extern "C" {
    #[no_mangle]
    static magic: *const c_void;
}

extern之前可以选择添加#[link(kind="static", name="<c library name>")],以获取实际链接的符号。

即使是常量,可从外部链接的项也需要使用static进行声明,而不仅仅是const关键字(否则会出现“extern items cannot be const”错误)。


8
在Rust和C语言中,“const”和“static”并不意味着相同的事情。 Rust中的“static”定义了该值具有地址,“const”则没有。 在这种情况下,“const”更接近于C中的“#define”。阅读第一版书中的“const” vs“static”章节以了解更多信息。 - Shepmaster
@Kornel 如果底层 C 类型是 int32 而不是 void,该怎么做呢? - user2284570

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接