如何在 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 引用。

免责声明:我是箱子的作者。