Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在FFI中使用()(和其他零大小类型)_Rust_Ffi - Fatal编程技术网

Rust 在FFI中使用()(和其他零大小类型)

Rust 在FFI中使用()(和其他零大小类型),rust,ffi,Rust,Ffi,在锈迹斑斑的地方进行FFI时,与()(或任何其他)有何等效之处?具体来说,我很好奇在编写外部“C”函数时,作为函数参数的()最合理的等价物是什么 我的理解是,零大小的类型在C中无效,但Rust似乎允许它们在extern“C”函数中使用,例如: #[无损坏] 发布外部“C”fn测试(输入:())->(){ } 在这种情况下,返回()与在C#中声明void函数相同。但是,我不清楚从C生成绑定时如何声明input参数。我的印象是ZST在C中不可表示,因此不应该是FFI安全的。这似乎是一个故事,说:

在锈迹斑斑的地方进行FFI时,与
()
(或任何其他)有何等效之处?具体来说,我很好奇在编写
外部“C”
函数时,作为函数参数的
()
最合理的等价物是什么

我的理解是,零大小的类型在C中无效,但Rust似乎允许它们在
extern“C”
函数中使用,例如:

#[无损坏]
发布外部“C”fn测试(输入:())->(){
}
在这种情况下,返回
()
与在C#中声明
void
函数相同。但是,我不清楚从C生成绑定时如何声明
input
参数。我的印象是ZST在C中不可表示,因此不应该是FFI安全的。这似乎是一个故事,说:

为了避免在FFI中使用
()
时出现警告,我们改为使用空数组(
[u8;0]
),它与空类型一样工作,但与FFI兼容


这似乎意味着
()
与FFI不兼容,但
[u8;0]
是(即使我希望它也是零大小)

在C中没有等价物
()
。有些人可能认为
void
是等价物,但事实并非如此。当然,它们有相似之处,在大多数情况下,它们是可互换的,正如您所说:
pub extern“C”fn test_ffi()->()
将正确地解释为
void test_ffi(void)
。(注意:这里参数列表中的
void
表示函数不带参数,因此它不是空类型)

您可以将
void
视为一无所有,但
()
是否一无所有?不,它是一个空元组,
void
实际上什么都不是

我的印象是ZST不能用C表示,因此不应该是FFI安全的

不,它们在C:
pub extern“C”fn test_ffi(输入:(),foo:i32)->()
中不可表示,这里不清楚Rust编译器应该理解什么,因为
void test_ffi(void,int32_t foo)在C中无效

使用空数组使类型不透明。我不建议这样做,但是对于这个特定的用例来说可以。无论如何,C中的不透明类型都是邪恶的。请注意,空数组在C中是非法的,因此只能在生锈的一侧使用


我建议不要在任何FFI中使用任何零大小的类型。

Void在C/C++中有重载的含义。它可以表示函数不带参数或不返回任何内容,也可以是一个
void*
,一个指向某些数据的指针,但不说明该数据是什么

对于前一种情况,对于不返回任何参数或不接受任何参数的函数,只需在函数描述中省略它们即可。从技术上讲,不返回任何内容的函数返回的是
()
,但它不需要显式编写。在这种情况下,单位类型的用途与
void
相同,即使单位是某物而不是无


对于
void*
的后一种情况,板条箱将a定义为空枚举,然后使用
mut*c_void
const*c_void
作为使用void指针的参数和结构的类型。

只是为了确认:零长度类型在c中无效,因此在c FFI情况下不能(不应该)使用Rust ZST。谢谢!确认ZST在C FFI中无效(除了
()
作为返回类型是一种特殊情况)是我一直在寻找的。