В Rust, почему `void *` — это `* mut c_void`, а не `* mut ()`? Могу ли я использовать `* mut ()` для безопасного представления адреса `void *`?

#rust #void-pointers

#Ржавчина #void-указатели

Вопрос:

В 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* безопасного представления?

Комментарии:

1. void на самом деле не может быть представлен в rust, поэтому нулевой тип не может быть представлен в C, но в Rust разрешен. в Rust void нет () , void — это ничто, оно не может быть ничем, () — это пустой кортеж, а не ничто. вы НЕ МОЖЕТЕ создать void в C, единственное, что вы можете сделать, это преобразовать некоторый указатель в void * that и сделать обратное, но это все. лучшим в rust был бы невозможный тип !

2. Нам нравится думать о void C как о типе unit, как потому, что это имеет смысл математически, так и потому, что такие языки, как Scala и Rust, явно делают это так. Но в отличие от Scala (где математическое сравнение полностью корректно), void в C это неудобный тип типа «пустой», типа «не». Аргумент типа void никогда не может быть передан, но значение типа void может быть возвращено неявно. В любой обычной системе типов (например, Хиндли-Милнер) тип с такими свойствами абсурден. Следовательно, это действительно нечто принципиально иное (и более странное), чем тип единицы измерения Rust.

3. @SilvioMayolo: void создает столько проблем в «общем» (макро / шаблоны) коде. Он может быть возвращен, даже возвращена цепочка ( return foo(); с void foo(); ), но не может быть сохранен в переменной: (

4. @MatthieuM. но нет, функция, которая возвращает void, на самом деле не возвращает, функция ничего не возвращает, а не что-то вызывает void . Это ключевое слово, а не реальный тип