Подтвердить что ты не робот

Может ли библиотека ржавчины использоваться с других языков так, как это делают библиотеки c?

Написав такую ​​библиотеку, я должен пожертвовать std? Как, например, я буду писать привязки python в библиотеку ржавчины, если это возможно?

4b9b3361

Ответ 1

Сначала укажите Rust, что вы хотите создать функцию, видимую для C:

#[no_mangle]
pub extern "C" fn some_func() { ... }

Это говорит Rust, чтобы избежать искажения выходного символа и использовать C ABI.

Затем вам нужно будет использовать C-совместимые типы при пересечении границы. Вот несколько советов, которые сработали для меня:

  • Если вы планируете передать структуру Rust на C как непрозрачные данные, которые будут переданы обратно в другие функции, верните ее как Box<T> и возьмите ее как &T или Box<T>. По сути, это означает, что вы отказываетесь от владения структурой в Rust и предоставляете право собственности на код C. Код C должен гарантировать, что если он вернет указатель обратно в функцию, которая принимает поле, он больше не использует его.
  • Если вы планируете передать структуру Rust на C как структуру C, Rust удобно представляет свои структуры в C-совместимом режиме. Однако вы захотите ограничить типы значений, которые вы вставляете в эти структуры, в типы, которые также имеют совместимые представления C. Конечно, числовые типы и логические элементы безопасны.
  • В документах под core:: raw вы можете увидеть представление Rust более сложных типов (например, vecs и strings). A &str и &[T] представлены как raw:: Slice, а Vec<T> представляется как raw::. Vec
  • Вы также можете преобразовать типы в libc:: types
  • Наконец, вам может понадобиться работать с указателями напрямую. Проверьте std:: mem на полезные API.