在Rust中进行FFI时,()
(或任何其他零大小类型)的等效物是什么?具体而言,当编写extern "C"
函数时,我想知道作为函数参数的()
的最合理等效物。
我的理解是,在C中,零大小类型无效,但是Rust似乎允许它们存在于extern "C"
函数中,例如:
#[no_mangle]
pub extern "C" fn test_ffi(input: ()) -> () {
}
在这种情况下,返回
()
与在C#中声明一个void
函数相同。然而,我不清楚在从C生成绑定时如何声明input
参数。我的印象是ZSTs在C中不可表示,因此不应该是FFI安全的。nomicon似乎证实了这一点,它说:
这似乎意味着为避免在FFI中使用
()
而导致警告,我们改用一个空数组([u8; 0]
),它与空类型一样有效,但是FFI兼容。
()
不是FFI兼容的,但[u8; 0]
是(即使我也希望它也是零大小)?