Взаимодействие с C
Rust полностью поддерживает связывание объектных файлов с соглашением о вызовах C. Аналогично вы можете экспортировать функции Rust и вызывать их из C.
Если хотите, можно сделать это вручную:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
unsafe extern "C" {
safe fn abs(x: i32) -> i32;
}
fn main() {
let x = -42;
let abs_x = abs(x);
println!("{x}, {abs_x}");
}
Мы уже видели это в упражнении «Безопасная обёртка FFI».
Это предполагает полное знание целевой платформы. Не рекомендуется для рабочего кода.
Лучшие варианты мы рассмотрим дальше.
-
Часть
"C"блокаexternсообщает Rust, чтоabsможно вызывать, используя ABI (двоичный интерфейс приложений) C. -
Часть
safe fn absсообщает Rust, чтоabs— безопасная функция. По умолчанию внешние функции небезопасны, но посколькуabs(x)не может вызвать неопределённое поведение ни при какомx, мы можем объявить её безопасной.