programing

러스트 코드에서 C나 C++ 함수를 호출할 수 있습니까?

telecom 2023. 9. 27. 16:54
반응형

러스트 코드에서 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

반응형