Files
simple-rust-tests/__ffi/calltoc/src/main.rs
2022-12-30 13:04:31 +08:00

38 lines
665 B
Rust

use std::ffi::{c_char, CStr};
use std::ops::Deref;
extern "C" {
fn hello() -> *const c_char;
fn goodbye(s: *const c_char);
}
struct Greeting {
message: *const c_char,
}
impl Drop for Greeting {
fn drop(&mut self) {
unsafe { goodbye(self.message); }
}
}
impl Greeting {
fn new() -> Greeting {
Greeting { message: unsafe { hello() } }
}
}
impl Deref for Greeting {
type Target = str;
fn deref<'a>(&'a self) -> &'a str {
let c_str = unsafe{ CStr::from_ptr(self.message) };
c_str.to_str().unwrap()
}
}
fn main() {
let greeting = Greeting::new();
println!("{}", greeting.deref());
}