如何在 Rust FFI 中发布常量字符串?
How to publish a constant string in the Rust FFI?
我想让 Rust 库向 C 公开一个 const char *
静态字符串,以与现有接口兼容(特别是 librsync)。即C头文件有
extern char const *my_string;
在 C 中,库只需要
char const *my_string = "hi";
在 Rust 中,我尝试过类似的东西
pub static my_string: *const libc::c_char = unsafe { "hi[=12=]" as *const libc::c_char };
但这抱怨
error: casting `&'static str` as `*const i8` is invalid
看来我不能使用 CString
等,因为它们不是编译时常量表达式。
我们需要一个 public、静态的、未损坏的指向一些零终止字节的指针:
#[export_name = "CONST_C_STR"] // or #[no_mangle]
pub static CONST_C_STR: &[u8; 20] = b"a constant c string[=10=]";
这适用于一个简单的 C 程序:
#include <stdio.h>
extern char * CONST_C_STR;
int main(int argc, char *argv[]) {
printf("%s\n", CONST_C_STR);
}
crate c_str_macro 提供了一个方便的宏 c_str!
,它将一个 0 字节附加到 Rust 字符串文字并将其呈现为 CStr
引用。
免责声明:我是箱子的作者。
我想让 Rust 库向 C 公开一个 const char *
静态字符串,以与现有接口兼容(特别是 librsync)。即C头文件有
extern char const *my_string;
在 C 中,库只需要
char const *my_string = "hi";
在 Rust 中,我尝试过类似的东西
pub static my_string: *const libc::c_char = unsafe { "hi[=12=]" as *const libc::c_char };
但这抱怨
error: casting `&'static str` as `*const i8` is invalid
看来我不能使用 CString
等,因为它们不是编译时常量表达式。
我们需要一个 public、静态的、未损坏的指向一些零终止字节的指针:
#[export_name = "CONST_C_STR"] // or #[no_mangle]
pub static CONST_C_STR: &[u8; 20] = b"a constant c string[=10=]";
这适用于一个简单的 C 程序:
#include <stdio.h>
extern char * CONST_C_STR;
int main(int argc, char *argv[]) {
printf("%s\n", CONST_C_STR);
}
crate c_str_macro 提供了一个方便的宏 c_str!
,它将一个 0 字节附加到 Rust 字符串文字并将其呈现为 CStr
引用。
免责声明:我是箱子的作者。