Rust bindings for C++ functions

Rust code can call extern "C" functions defined in C++, provided that the parameter and return types are supported by Crubit:

  • If a parameter or return type is a fundamental type, then the bindings for the function use the corresponding Rust type.
  • Similarly, if a parameter or return type is a pointer type, then the bindings for the function use the corresponding Rust pointer type.
  • If the type is a user-defined type, such as a class type or enum, then the bindings for the function use the bindings for that type.

Example

Given the following C++ header:

cs/file:examples/cpp/function/example.h content:^([^/#\n])[^\n]*

Crubit will generate the following bindings, containing a safe public function and the corresponding FFI glue:

cs/file:examples/cpp/function/example_generated.rs content:^([^/\n])([^!\n]|$)[^\n]*

unsafe functions

Functions accepting or returning simple types, like integers, can be called from safe code. However, functions which accept a raw pointer are automatically marked unsafe, and cannot be called outside of an unsafe block. To ensure that the behavior is defined, callers must:

  • Ensure that the pointer being passed to C++ is a valid C++ pointer. In particular, it must not be dangling (e.g. Nonnull::dangling()).

  • Ensure that the safety conditions documented in C++ are upheld. For example, if the C++ function accepts a reference or non-null pointer, then do not pass in 0 as *const _.

However, even “safe” C++ functions are still potentially dangerous, and can still have undefined behavior when called. Callers must still adhere to all documented function preconditions.

Function Attributes

Function attributes are not currently supported. Functions marked [[noreturn]], [[nodiscard]], etc. do not have bindings.