#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 . Это ключевое слово, а не реальный тип