W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
注意: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ú)立程序可以通過 malloc
和 free
來動態(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
, deref
和 add
.
展開堆棧和一般性錯誤。eh_personality
, fail
和 fail_bounds_checks
lang項(xiàng)目。
std::marker
中的特點(diǎn)用于表示不同類型,lang 項(xiàng)目 send
, sync
和 copy
。
std::marker
中的標(biāo)記類型和變量指示符,lang 項(xiàng)目有 covariant_type, contravariant_lifetime lang 項(xiàng)目會被編譯器以消極的方式加載。如果用戶不使用 Box ,那么就不需要為 exchange_malloc
和 exchange_free
定義函數(shù)。當(dāng)以個lang 項(xiàng)目在當(dāng)前代碼中存在,那么 rustc
就會發(fā)出錯誤提示。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: