gpt4 book ai didi

rust - 如何在不实例化的情况下在 Rust 中获取结构字段的大小

转载 作者:行者123 更新时间:2023-12-03 11:26:00 26 4
gpt4 key购买 nike

我有一个包含字节数组的结构。这个结构实际上来自于 bindgen 生成的 FFI 绑定(bind),它的大小是在 C 代码中使用宏定义的,即:

C代码:

#define FOO_SIZE 100

struct the_struct
{
char foo[FOO_SIZE];
/* other fields... */
};

生成的 FFI 绑定(bind):

pub struct the_struct {
pub foo: [::std::os::raw::c_char; 100usize],
// other fields...
}

我想确保来自 Rust API 端的数据适合 foo .我也不想硬编码 FOO_SIZE在我的 Rust API 中,因为它可能会发生变化。

我知道这可以通过首先实例化结构来完成,但话又说回来,这需要显式初始化 foo ,如果不知道它的大小,这似乎是不可能的。此外,这是我想避免的额外步骤。

是否有可能以某种方式获得 foo 的大小?静态而不实例化结构?如果没有,最好的方法是什么?更改 C 代码不是一种选择。

最佳答案

在夜间 channel 上,我想出了这个:

#![feature(raw_ref_op)]

pub struct the_struct {
pub foo: [::std::os::raw::c_char; 100usize],
// other fields...
}

fn main() {
let foo_size: usize = {
fn size<T>(_: *const T) -> usize {
std::mem::size_of::<T>()
}

let null: *const the_struct = std::ptr::null();
size(unsafe { &raw const (*null).foo })
};

println!("{}", foo_size);
}

据我所知, &raw const (*null).foo不是 UB,因为明确允许取消引用空指针以获取另一个指针。不幸的是,这不仅需要仍然不稳定的 raw_ref_op功能,但因为 this 取消引用指针,所以 this 也不能是 const .

关于rust - 如何在不实例化的情况下在 Rust 中获取结构字段的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61046063/

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