gpt4 book ai didi

rust - 使用 C/C++ 的类似于共享选项的可序列化类型

转载 作者:行者123 更新时间:2023-12-05 05:33:26 25 4
gpt4 key购买 nike

我正在编写一个 Rust 库,并且我有一个结构(这里只显示了我的罪魁祸首字段)。在许多情况下,我将实际的可序列化结构或其他数据分配给 my_field , 但偶尔我会没有数据,因此想分配 null或没有项目。

我试图通过像这样返回(在创建这些消息结构的函数中)来做到这一点:Message<[u8; 0]> ,并且我有返回此类型的 ffi 函数,转换为 Message<uint8_t[0]>作为生成的头文件中那些函数的返回类型(使用 cbindgen )。

但是,用大小为 0 的数组编译 C++ 程序会给出警告:

the size of an array must be greater than 0

我可以使用什么使用rust 类型/技术来解决这个问题? *const u8不可序列化,Option在 C++ 中不存在

#[repr(C)]
#[derive(Serialize, Deserialize)]
pub struct Message<T: Serialize> {
pub my_field: T
}

最佳答案

我认为只有两种方法可以绕过这个警告:

  • 关闭 ISO C++ 警告。 IIrc,ISO C++ 根本不允许零大小的结构。 (我现在能找到的最好的引用是 sizeof:“sizeof 的结果总是非零的”)
  • 为具有 1 字节大小内存表示的 T 使用一些自定义虚拟结构。您仍然可以通过跳过所有字段(或使用自定义反序列化器)来确保序列化表示的大小为 0:
#[repr(C)]
#[derive(Serialize, Default)]
pub struct Nil {
#[serde(skip)]
_dummy: u8,
}

#[no_mangle]
pub extern "C" fn mk_Nil() -> Nil {
Default::default()
}

关于rust - 使用 C/C++ 的类似于共享选项的可序列化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73850181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com