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

时间:2014-06-08 10:25:46

标签: c++ c rust

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

3 个答案:

答案 0 :(得分:5)

Rust可以通过FFI链接到/调用C函数,而不是C ++函数。

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

答案 1 :(得分:5)

Rust不直接支持这一点,C ++函数符号修改是实现定义的,因此需要Rust的大量支持来处理这个特性。这不是不可能,但可能不会发生。

然而,Rust声称支持C语言。这显然更容易支持,因为它“只”需要支持C的函数调用。这也是实现定义的行为,但这并没有改变很多,人们同意共同努力共享相同的约定所以在共同平台上使用C作为中介时,你不会有任何问题。

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

从Rust调用C,the docs show this example

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

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

从C调用C ++,the docs show this example

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

要将此示例转换为Rust中的示例,它会给出:

#include <cstdlib>
#include <cinttypes>

extern "C" std::int32_t abs(std::int32_t n) {
    return std::abs(static_cast<std::intmax_t>(n));
}

答案 2 :(得分:0)

如果您希望从 libc 调用C函数,则有一个锈板条箱可以直接在rus​​t中编写类似C的代码,其中有些需要不安全的块。

以下是设置无文件系统限制的示例。该代码的说明位于man 2 setrlimit中,即该代码几乎直接从C映射到rust。

use libc::rlimit;
use libc::setrlimit;
use libc::RLIMIT_NOFILE;

/// Set system limits on number of "open files"
pub fn increase_rlimit_nofile(limit: u64) -> i32 {
    let lim = rlimit {
        rlim_cur: limit,
        rlim_max: limit
    };
    unsafe {
        let rv: i32 = setrlimit(RLIMIT_NOFILE, &lim);
        return rv;
    }
}