Crate cpp [−] [src]
This crate cpp
only provides a single macro, the cpp!
macro. This macro
by itself is not useful, but when combined with the cpp_build
crate it
allows embedding arbitrary C++ code.
There are two variants of the cpp!
macro. The first variant is used for
raw text inclusion. Text is included into the generated C++
file in the
order which they were defined, inlining module declarations.
cpp! {{ #include <stdint.h> #include <stdio.h> }}
The second variant is used to embed C++ code within rust code. A list of variable names which should be captured are taken as the first argument, with their corresponding C++ type. The body is compiled as a C++ function.
This variant of the macro may only be invoked in expression context, and
requires an unsafe
block, as it is performing FFI.
let y: i32 = 10; let mut z: i32 = 20; let x: i32 = cpp!([y as "int32_t", mut z as "int32_t"] -> i32 as "int32_t" { z++; return y + z; });
Usage
This crate must be used in tandem with the cpp_build
crate. A basic Cargo
project which uses these projects would have a structure like the following:
crate
|-- Cargo.toml
|-- src
|-- lib.rs
|-- build.rs
Where the files look like the following:
Cargo.toml
[package]
build = "build.rs"
[dependencies]
cpp = "0.3"
[build-dependencies]
cpp_build = "0.3"
build.rs
extern crate cpp_build; fn main() { cpp_build::build("src/lib.rs"); }
lib.rs
#[macro_use] extern crate cpp; cpp!{{ #include <stdio.h> }} fn main() { unsafe { cpp!([] { printf("Hello, World!\n"); }); } }
Macros
cpp |
This macro is used to embed arbitrary C++ code. See the module level documentation for more details. |