Lang 項(xiàng)目

2018-08-12 22:03 更新

Lang 項(xiàng)目

注意:lang 項(xiàng)目一般是由 Rust 發(fā)布的封裝提供的,lang 項(xiàng)目本身具有不穩(wěn)定的接口。最好使用官方發(fā)布的封裝,不要使用自己編寫的 lang 項(xiàng)目。

rustc 編譯器具有可插拔的操作功能,它并不是硬編碼成語言的,而是被以庫的形式實(shí)現(xiàn),并且以特殊標(biāo)記來告知編譯器它的存在。這個標(biāo)記就是 #[lang = "..."],并且有多種多樣的值,多種多樣的 lang 項(xiàng)目。

例如,Box 指針需要兩個 lang 項(xiàng)目,一個是分配,一個是回收。一個使用 Box 的獨(dú)立程序可以通過 mallocfree 來動態(tài)的管理內(nèi)存分配。

#![feature(lang_items, box_syntax, start, no_std, libc)]
#![no_std]

extern crate libc;

extern {
fn abort() -> !;
}

#[lang = "owned_box"]
pub struct Box<T>(*mut T);

#[lang = "exchange_malloc"]
unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
let p = libc::malloc(size as libc::size_t) as *mut u8;

// malloc failed
if p as usize == 0 {
abort();
}

p
}
#[lang = "exchange_free"]
unsafe fn deallocate(ptr: *mut u8, _size: usize, _align: usize) {
libc::free(ptr as *mut libc::c_void)
}

#[start]
fn main(argc: isize, argv: *const *const u8) -> isize {
let x = box 1;

0
}

#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }

注意 abort 的使用:exchange_malloc lang 項(xiàng)目可以被認(rèn)為是返回一個有效的指針,且需要內(nèi)部的檢查。

其他的由 lang 項(xiàng)目提供的功能包括:

  • 基于特征的可重載操作符:操作符 ==, <, * 和 + 都被 lang 項(xiàng)目標(biāo)記起來。這些特殊的操作符對應(yīng)于 eq, ord, derefadd.

  • 展開堆棧和一般性錯誤。eh_personality, failfail_bounds_checks lang項(xiàng)目。

  • std::marker 中的特點(diǎn)用于表示不同類型,lang 項(xiàng)目 send, synccopy。

  • std::marker中的標(biāo)記類型和變量指示符,lang 項(xiàng)目有 covariant_type, contravariant_lifetime

lang 項(xiàng)目會被編譯器以消極的方式加載。如果用戶不使用 Box ,那么就不需要為 exchange_mallocexchange_free定義函數(shù)。當(dāng)以個lang 項(xiàng)目在當(dāng)前代碼中存在,那么 rustc 就會發(fā)出錯誤提示。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號