Ejemplos

CXX necesita que se declare todo el límite de C++ o Rust en los módulos cxx::bridge del código fuente .rs.

#[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>;
    }
}

// Las definiciones de los tipos y las funciones de Rust se colocan aquí

Señala lo siguiente:

  • Aunque parece un mod de Rust habitual, la macro de procedimiento #[cxx::bridge] es capaz de desempeñar tareas complejas. El código generado es bastante más sofisticado, aunque aun así da como resultado un mod llamado ffi en el código.
  • Compatibilidad nativa con std::unique_ptr de C++ en Rust.
  • Compatibilidad nativa con los slices de Rust en C++.
  • Llamadas de C++ a Rust y tipos de Rust (en la parte superior).
  • Llamadas de Rust a C++ y tipos de C++ (en la parte inferior).

Error común: Parece que Rust está analizando un encabezado de C++, pero no es así. Rust nunca interpreta este encabezado, sino que simplifica #included en el código C++ generado para ayudar a los compiladores de C++.