在Rust中,为什么'void*'是'*mut c_void'而不是'*mut()`?我可以用“*mut()”安全地表示一个“void*`地址吗?

在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

在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",
        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();
with
void 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();
with
void foo();
),但不能存储在变量中:(@MatthieuM。但是不,返回void的函数实际上不返回任何内容,而不是调用void的内容。它是一个关键字,不是一个实际类型