在Rust中,为什么'void*'是'*mut c_void'而不是'*mut()`?我可以用“*mut()”安全地表示一个“void*`地址吗?
在rust中,在Rust中,为什么'void*'是'*mut c_void'而不是'*mut()`?我可以用“*mut()”安全地表示一个“void*`地址吗?,rust,void-pointers,Rust,Void Pointers,在rust中,void是(),但void*是枚举的指针 #[repr(u8)] #[stable(feature = "core_c_void", since = "1.30.0")] pub enum c_void { #[unstable( feature = "c_void_variant", reason = "temporary implementation detail&qu
void
是(),但void*
是枚举的指针
#[repr(u8)]
#[stable(feature = "core_c_void", since = "1.30.0")]
pub enum c_void {
#[unstable(
feature = "c_void_variant",
reason = "temporary implementation detail",
issue = "none"
)]
#[doc(hidden)]
__variant1,
#[unstable(
feature = "c_void_variant",
reason = "temporary implementation detail",
issue = "none"
)]
#[doc(hidden)]
__variant2,
}
我可以用
*mut()
安全地表示void*
吗?void不能用rust表示,这就是为什么C不能表示零类型,但rust是允许的。在Rust中,void不是(),
,void什么都不是它不可能是什么,()是一个空元组,而不是什么都不是。你不能在C语言中构造一个空,你唯一能做的就是把指针转换成一个空,然后做相反的事情,但就是这样。最好的防锈剂是不可能的类型代码>我们喜欢把C中的void
看作是一种单元类型,因为它在数学上是有意义的,而且像Scala和Rust这样的语言明确地做到了这一点。但与Scala(数学比较完全正确)不同,C中的void
是一种笨拙的空类型,一种not类型。永远不能传递类型为void
的参数,但可以隐式返回类型为void
的值。在任何传统的类型系统中(例如,想想Hindley Milner),具有这些属性的类型都是荒谬的。因此,它确实与Rust的单元类型有着根本的不同(而且更奇怪)。@SilvioMayolo:void
在“通用”(宏/模板)代码中造成了如此多的麻烦。它可以返回,甚至是链返回(return foo();
withvoid foo();
),但不能存储在变量中:(@MatthieuM.但是不,一个返回void的函数,实际上不返回任何东西,而不是调用void的东西。它是一个关键字不是一个真正的类型void不能用rust表示,这就是为什么零类型不能用C表示,但在rust中是允许的。在rust void中不是()
,void什么也不是,它不能是任何东西,()空元组不是空的。你不能在C中构造一个空,你唯一能做的就是将一些指针转换到一个空*并做相反的事情,但这一切。rust中最好的是不可能的类型!
我们喜欢把C中的void
看作是一个单元类型,因为它在数学上和语言上都有意义与Scala和Rust一样,C中的void
是一种笨拙的空类型,一种not类型。类型void
的参数永远无法传递,但类型void
的值可以隐式返回。在任何传统类型系统中(以辛德利·米尔纳(Hindley Milner)为例),一个具有这些属性的类型是荒谬的。因此,它确实与Rust的单位类型有着根本的不同(而且更奇怪)。@SilvioMayolo:void
在“泛型”(宏/模板)代码中造成了如此多的麻烦。它可以返回,甚至链返回(return foo();
withvoid foo();
),但不能存储在变量中:(@MatthieuM。但是不,返回void的函数实际上不返回任何内容,而不是调用void的内容。它是一个关键字,不是一个实际类型