如何创建静态C字符串?

时间:2015-04-10 14:17:09

标签: string static rust ffi

我想在Rust中创建一个插件模块(共享库),它导出一个包含静态C字符串的C兼容结构。 2014年9月,this Stack Overflow question确定无法做到这一点。截至2015年1月,根据this Reddit thread,这仍然是不可能的。从那以后有什么变化吗?

1 个答案:

答案 0 :(得分:1)

以下似乎可以解决问题。我真的不希望结构是可变的,但如果我没有将它标记为mut,我会得到core :: marker :: Sync错误。

extern crate libc;

use libc::funcs::c95::stdio::puts;
use std::mem;

pub struct Mystruct {
    s1: *const u8,
    s2: *const u8,
}

const CONST_C_STR: *const u8 = b"a constant c string\0" as *const u8;

#[no_mangle]
pub static mut mystaticstruct: Mystruct = Mystruct {
    s1: CONST_C_STR,
    s2: b"another constant c string\0" as *const u8
};

fn main() {
    unsafe{
        puts(mystaticstruct.s1 as *const i8); // puts likes i8
        puts(mystaticstruct.s2 as *const i8);
        println!("Mystruct size {}", mem::size_of_val(&mystaticstruct));
    }
}

输出(在64位linux上)是......

a constant c string
another constant c string
Mystruct size 16