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

如何在不实例化的情况下获得Rust中结构字段的大小,rust,ffi,rust-bindgen,Rust,Ffi,Rust Bindgen,我有一个包含字节数组的结构。此结构实际上来自bindgen生成的FFI绑定,其大小在C代码中使用宏定义,即: C代码: #定义FOO#u尺寸100 结构 { char foo[foo_SIZE]; /*其他领域*/ }; 生成的FFI绑定: pub结构\u结构{ pub foo:[::std::os::raw::c_char;100usize], //其他领域。。。 } 我想确保来自Rust API端的数据适合foo。我也不想在我的Rust API中硬编码FOO_SIZE,因为它可能会更改

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

C代码:

#定义FOO#u尺寸100
结构
{
char foo[foo_SIZE];
/*其他领域*/
};
生成的FFI绑定:

pub结构\u结构{
pub foo:[::std::os::raw::c_char;100usize],
//其他领域。。。
}
我想确保来自Rust API端的数据适合
foo
。我也不想在我的Rust API中硬编码
FOO_SIZE
,因为它可能会更改

我知道这可以通过先实例化struct来实现,但这需要显式初始化
foo
,如果不知道它的大小,这似乎是不可能的。此外,这是我想避免的额外步骤


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

我不知道是否有可能获得数组大小,但是如果没有太多这样的结构,并且大小也不会经常更改,我只会显式声明该值:

pub const FOO_SIZE:usize=100;
然后声明一个函数,如果硬编码常量错误,该函数将无法编译:

fn\u断言\u foo\u大小(s:&mut结构){
s、 foo=[0;foo_大小];
}

在晚间频道,我想到了这个:

#![特征(原始参考操作)]
pub结构{
pub foo:[::std::os::raw::c_char;100usize],
//其他领域。。。
}
fn main(){
让foo_大小:usize={
fn大小(:*常数)->使用{
std::mem::size_of::()
}
设null:*const the_struct=std::ptr::null();
大小(不安全的{&raw const(*null).foo})
};
println!(“{}”,foo_size);
}

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

谢谢!这是一种可行的方法,但在我的情况下,它并不完全合适,因为
FOO_SIZE
根据产品构建配置而变化,在我的Rust API中实现这个逻辑会使整个过程变得非常脆弱。除非我找到更好的解决方案,否则我将不得不或多或少地这样做……虽然我不愿意每晚使用我开发的产品,但这似乎是最接近我需要的。谢谢使用
NonNull::dangling()
而不是
null
怎么样?它能在stable中用于此吗?@rodrigo不,您将创建一个对初始化对象的引用,它是UB。@mcarton:啊,我明白了。我仍然需要
&raw
,然后
dangling()
在普通的
null()
上买不到任何东西。