Rust 程式設計視訊教程(進階)——025_3 呼叫不安全的函式或方法

linghuyichong發表於2020-02-17

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

(1)呼叫方式。不安全函式和方法與常規函式方法十分類似,除了其開頭有一個額外的 unsafe。
例子1:

unsafe fn dangerous() {
    println!("Do some dangerous thing");
}
fn main() {
    unsafe {
        dangerous();
    }
    println!("Hello, world!");
}

(2)建立不安全程式碼的安全抽象

fn foo() {
    let mut num = 5;
    let r1 = &num as *const i32;
    let r2 = &mut num as *mut i32;
    unsafe {
        println!("r1 is: {}", *r1);
        println!("r2 is: {}", *r2);
    }
}
fn main() {
    foo();
}

(3)使用extern函式呼叫外部程式碼
extern關鍵字,有助於建立和使用 外部函式介面(Foreign Function Interface, FFI)。
例子1:呼叫c語言函式

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

fn main() {
    unsafe {
        println!("abs(-3): {}", abs(-3));
    }
}

例子2:c語言呼叫rust語言
(a)cargo new foo –lib
(b)vim src/lib.rs編寫程式碼:

#![crate_type = "staticlib"]
#[no_mangle]
pub extern fn foo(){
    println!("use rust");
}

編寫cargo.toml

[lib]
name = "foo"
crate-type = ["staticlib"]

(c)編譯後生成 libfoo.a的靜態庫
(d)編寫c語言的程式碼:

//main.c
#include <stdint.h>
#include <stdio.h>
extern void foo();
int main() {
    foo();
    return 0;
}

(e)編譯執行:gcc -o main main.c libfoo.a -lpthread -ldl

本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章