记录一个 Rust 手动写 FFI 遇到的坑
// some C code
struct Something {
    int xxx;
    int yyy;
    int zzz[];
}

好的,垃圾rust已经炸了,因为垃圾rust不支持VLA和这玩意儿,所以这个应该怎么写呢?!

#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
    xxx: i32,
    yyy: i32,
    zzz: *mut i32
}

所以这样行不行…

意思虽然是这个意思,可是size不一样,已知C的size是8(i32 * 2), 但是这个的size是16(i32 * 2 + 64bit pointer)

#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
    xxx: i32,
    yyy: i32,
    zzz: [i32]
}

这样看起来是行了,

我们上网查了查memory layout也对的上

可是 [i32]?Sized 所以不能 CopyClone,我们就基本写不了代码…

最后我们可以使用C的一些奇技淫巧:零长度数组

这个东西在算layout时可谓是非常的好用,在rust里面也照样发挥余光!

#[repr(C)]
#[derive(Copy, Clone)]
struct Something {
    xxx: i32,
    yyy: i32,
    _zzz: [i32; 0]
}

impl Something {
    unsafe fn zzz(&self, len: usize) -> &[i32] {
        std::slice::from_raw_parts(self._zzz.as_ptr(), len)
    }
    unsafe fn zzz_mut(&self, len: usize) -> &[i32] {
        std::slice::from_raw_parts_mut(self._zzz.as_mut_ptr(), len)
    }
}

行…太丑了,凑合用吧

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇