Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Взаимодействие с 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, мы можем объявить её безопасной.