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

Пример привязок

CXX требует, чтобы вся граница C++/Rust объявлялась в модулях cxx::bridge внутри исходного кода .rs.

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[cxx::bridge]
mod ffi {
    extern "Rust" {
        type MultiBuf;

        fn next_chunk(buf: &mut MultiBuf) -> &[u8];
    }

    unsafe extern "C++" {
        include!("example/include/blobstore.h");

        type BlobstoreClient;

        fn new_blobstore_client() -> UniquePtr<BlobstoreClient>;
        fn put(self: &BlobstoreClient, buf: &mut MultiBuf) -> Result<u64>;
    }
}

// Определения типов и функций Rust располагаются здесь

Обратите внимание:

  • Хотя это выглядит как обычный модуль Rust mod, процедурный макрос #[cxx::bridge] делает с ним сложные вещи. Сгенерированный код гораздо сложнее, хотя в вашем коде по-прежнему получается mod с именем ffi.
  • Нативная поддержка std::unique_ptr из C++ в Rust
  • Встроенная поддержка срезов Rust в C++
  • Вызовы из C++ в Rust и типы Rust (в верхней части)
  • Вызовы из Rust в C++ и типы C++ (в нижней части)

Распространённое заблуждение: кажется, что Rust разбирает заголовок C++, но это обманчиво. Этот заголовок Rust никогда не интерпретирует, а просто #include-ится в сгенерированный код C++ для компиляторов C++.