러스트 코드에서 C나 C++ 함수를 호출할 수 있습니까?
Rust 내에서 C 또는 C++ 함수 호출이 가능합니까?그렇다면 어떻게 됩니까?
러스트는 이를 직접 지원하지 않습니다, C++ 함수 심볼 망글링이 구현되어 있기 때문에 이 기능을 처리하려면 러스트의 많은 지원이 필요할 것입니다.불가능한 것은 아니지만 아마 그럴 일은 없을 것입니다.
그러나 러스트는 C 언어를 지원한다고 주장합니다.이것은 C의 기능 호출을 "전용"으로 지원해야 하기 때문에 분명 지원하기가 더 쉽습니다.이것도 구현이 정의된 행동이지만, 이것은 크게 바뀌지 않고 사람들이 협력하여 같은 협약을 공유하는 것에 동의하기 때문에 공통 플랫폼에서 C를 중개자로 사용하는 데 문제가 없을 것입니다.
그래서 러스트에서 C++를 부르려면 C를 지나가야 합니다.
Rust에서 C를 호출하는 문서는 다음과 같은 예를 보여줍니다.
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
println!("Absolute value of -3 according to C: {}", abs(-3));
}
}
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++
}
이 예제를 Rust의 예제로 변환하면 다음을 얻을 수 있습니다.
#include <cstdlib>
#include <cinttypes>
extern "C" std::int32_t abs(std::int32_t n) {
return std::abs(static_cast<std::intmax_t>(n));
}
녹은 해당 FFI를 통해 C 기능과 연결/호출할 수 있지만 C++ 기능은 연결할 수 없습니다.
왜 C++ 기능이라고 부르지 못하는지 모르겠지만 아마 C++ 기능이 복잡하기 때문일 것입니다.
libc에서 C 함수를 호출하고 싶다면 녹에 코드처럼 C를 직접 적을 수 있는 녹 상자가 있는데, 일부는 안전하지 않은 블록이 필요합니다.
아래는 nofile system limit 설정 예입니다.이 코드에 대한 지침이 다음에 있습니다.man 2 setrlimit
, 즉, 코드는 거의 직접적으로 C에서 녹으로 매핑됩니다.
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;
}
}
언급URL : https://stackoverflow.com/questions/24105186/can-i-call-c-or-c-functions-from-rust-code
'programing' 카테고리의 다른 글
jQuery : eq() vs get() (0) | 2023.09.27 |
---|---|
Node.js: req.query[]와 req.param의 차이 (0) | 2023.09.27 |
장고, 사용자 지정 500/404 오류 페이지 생성 (0) | 2023.09.27 |
mysql에 levenshtein 기능을 추가하는 방법은? (0) | 2023.09.17 |
XMLHttpRequest POST 다중부분/양식-데이터 (0) | 2023.09.17 |