C との相互運用性

Rust は、C の呼び出し規約を持つオブジェクトファイルとのリンクを完全にサポートしています。 同様に、Rust の関数をエクスポートし、C から呼び出すこともできます。

望むなら手作業で行うこともできます:

// 著作権 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}");
}

これはすでに Safe FFI Wrapper の演習で見ました。

これは、対象プラットフォームを完全に把握していることを前提としています。本番環境での 使用は推奨されません。

次に、より良い方法を見ていきます。

  • extern ブロックの "C" 部分 は、abs が C の ABI(アプリケーションバイナリインターフェース)を使って呼び出せることを Rust に伝えます。

  • safe fn abs の部分は、abs が安全な関数であることを Rust に伝えます。デフォルトでは、 extern 関数は unsafe ですが、abs(x) はどのような x に対しても未定義動作を 引き起こせないため、安全として宣言できます。