如何在 Rust 中获取结构体字段的大小而不实例化它

Rom*_*nko 6 ffi rust rust-bindgen

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

C代码:

#define FOO_SIZE 100

struct the_struct
{
    char foo[FOO_SIZE];
    /* other fields... */
};
Run Code Online (Sandbox Code Playgroud)

生成的 FFI 绑定:

pub struct the_struct {
    pub foo: [::std::os::raw::c_char; 100usize],
    // other fields...
}
Run Code Online (Sandbox Code Playgroud)

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

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

foo是否可以在不实例化结构的情况下以某种方式静态获取大小?如果不是,最好的方法是什么?更改 C 代码不是一个选项。

mca*_*ton 2

在夜间频道我想出了这个:

#![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);
}
Run Code Online (Sandbox Code Playgroud)

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