Back to Comprehensive Rust

Interoperability with C

src/android/interoperability/with-c.md

latest1.2 KB
Original Source
<!-- Copyright 2022 Google LLC SPDX-License-Identifier: CC-BY-4.0 -->

Interoperability with C

Rust has full support for linking object files with a C calling convention. Similarly, you can export Rust functions and call them from C.

You can do it by hand if you want:

rust
# // Copyright 2022 Google LLC
# // SPDX-License-Identifier: Apache-2.0
#
unsafe extern "C" {
    safe fn abs(x: i32) -> i32;
}

fn main() {
    let x = -42;
    let abs_x = abs(x);
    println!("{x}, {abs_x}");
}

We already saw this in the Safe FFI Wrapper exercise.

This assumes full knowledge of the target platform. Not recommended for production.

We will look at better options next.

<details>
  • The "C" part of the extern block tells Rust that abs can be called using the C ABI (application binary interface).

  • The safe fn abs part tells Rust that abs is a safe function. By default, extern functions are unsafe, but since abs(x) can't trigger undefined behavior with any x, we can declare it safe.

</details>