我可以从Rust代码调用C或C++函数吗?

use*_*895 11 c c++ rust

是否可以在Rust中调用C或C++函数?如果是这样,这是怎么做到的?

Sta*_*eur 9

Rust不直接支持此功能,C ++函数符号修饰是实现定义的,因此Rust需要很多支持才能处理此功能。这不是不可能,但可能不会发生。

但是,Rust声称支持C语言。这显然更容易支持,因为它“仅”需要支持C的函数调用。这也是实现定义的行为,但这并没有太大变化,人们同意一起共享相同的约定,因此使用C作为通用平台上的中介,您将没有问题。

因此,要从Rust调用C ++,必须通过C。

要从Rust调用C,文档将显示以下示例

extern "C" {
    fn abs(input: i32) -> i32;
}

fn main() {
    unsafe {
        println!("Absolute value of -3 according to C: {}", abs(-3));
    }
}
Run Code Online (Sandbox Code Playgroud)

从C,C ++函数必须等来定义称之为C ++ 这样

// This C++ function can be called from C code
extern "C" void handler(int) {
    std::cout << "Callback invoked\n"; // It can use C++
}
Run Code Online (Sandbox Code Playgroud)

将此示例转换为Rust中的示例,可以得到:

#include <cstdlib>
#include <cinttypes>

extern "C" std::int32_t abs(std::int32_t n) {
    return std::abs(static_cast<std::intmax_t>(n));
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*son 6

Rust可以通过其FFI链接到/调用C函数,但不能链接到C++函数.

虽然我不知道为什么你不能调用C++函数,但可能是因为C++函数很复杂.

  • 您可以在任何C++函数上定义C链接,使其可以从C中获得,因此也可以使用Rust.````extern"C"```是你的朋友. (3认同)