C++ для границ FFI Rust
Предоставляйте функции C++ для использования через FFI Rust и выполняйте обратное взаимодействие.
«C++ для границ FFI Rust» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
C++ и Rust
Rust и C++ — компилируемые языки низкого уровня, но у них разные ABI и несовместимые системы типов. Обычно они взаимодействуют через мост на основе C ABI.
Из Rust в C++: extern "C"
Экспортируйте функции Rust с помощью extern "C" и #[no_mangle].
// Rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}Вызов Rust из C++
Объявите функцию Rust в C++ и выполните компоновку со статической библиотекой Rust.
// C++
extern "C" int add(int a, int b);
std::cout << add(2, 3);Из C++ в Rust
Обратное направление: Rust вызывает C++. Оберните C++ в extern "C" и объявите функцию в Rust.
// C++
extern "C" int multiply(int a, int b) {
return a * b;
}
// Rust
extern "C" {
fn multiply(a: i32, b: i32) -> i32;
}Компоновка статических библиотек
Соберите пакет Rust как staticlib или cdylib и подключите его к сборке C++.
# Cargo.toml
[lib]
crate-type = ["staticlib"]Bindgen и Cbindgen
Автоматически создавайте объявления FFI:
- bindgen — создаёт привязки Rust из заголовков C++
- cbindgen — создаёт заголовки C/C++ из кода Rust
Пакет cxx
Пакет cxx обеспечивает более безопасное взаимодействие C++ и Rust на высоком уровне. Объявите общую схему — cxx создаст привязки с строгой типизацией для обеих сторон.
Владение памятью через FFI
Оба языка поддерживают RAII, но используют разные модели владения. Передавайте данные во владении по значению, а заимствованные данные — через сырой указатель; документируйте, кто что освобождает.
Строки через FFI
String Rust и std::string C++ несовместимы. Используйте *const c_char (строку с нулевым завершающим символом) или (*const u8, usize) (указатель и длину).
Исключения и паники
Паники Rust и исключения C++ небезопасно пересекают границу FFI. Перехватывайте исключения C++ на границе; на стороне Rust используйте std::panic::catch_unwind.
Интеграция сборки
Используйте метасистему сборки: CMake вызывает Cargo или Cargo вызывает CMake через сценарий сборки (build.rs). Пакет cxx обрабатывает распространённые схемы.
Примеры из реального мира
Во многих промышленных кодовых базах смешиваются C++ и Rust: Mozilla Firefox использует компоненты Rust внутри движка на C++; Chromium экспериментирует с модулями Rust; многие криптографические библиотеки предоставляют привязки для обоих языков.
Быстрая проверка
Какой атрибут Rust отключает искажение имён, чтобы C/C++ могли найти символ?
Итоги
Взаимодействие C++ и Rust осуществляется через ABI C. Используйте extern "C" и #[no_mangle]. Создавайте привязки с помощью bindgen и cbindgen либо используйте пакет cxx для более безопасных типизированных мостов. Внимательно обрабатывайте владение, строки и паники при пересечении границы.
Часто задаваемые вопросы
Урок «C++ для границ FFI Rust» бесплатный?
Да — полный текст урока «C++ для границ FFI Rust» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «C++ для границ FFI Rust»?
Предоставляйте функции C++ для использования через FFI Rust и выполняйте обратное взаимодействие. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «C++ для границ FFI Rust»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Extern C и ABI языка C
- Вызов Python из C++ через pybind11
- C++ для границ FFI Rust
- Использование SWIG для привязок нескольких языков