Нет эквивалента ()
в 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(input: (), foo: i32) -> ()
здесь неясно, что должен понимать компилятор Rust, потому что void test_ffi(void, int32_t foo);
недопустим в C.
Nomicon использует пустой массив, чтобы сделать типы непрозрачными. Я не рекомендовал бы это, но это могло бы быть хорошо для этого определенного c варианта использования. Непрозрачные типы в C в любом случае являются злом. Обратите внимание, что пустые массивы недопустимы в C, поэтому их следует использовать только на стороне Rust.
Я бы посоветовал никогда не использовать типы нулевого размера в любой FFI.