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 代码不是一个选项。
在夜间频道我想出了这个:
#![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。
| 归档时间: |
|
| 查看次数: |
3278 次 |
| 最近记录: |