是否可以在Rust中调用C或C ++函数?如果是这样,这是怎么做到的?
答案 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函数,则有一个锈板条箱可以直接在rust中编写类似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;
}
}