日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

37.rust属性.txt

發(fā)布時間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 37.rust属性.txt 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
===================================================================================================================================== 元素在Rust中,Item是Crate(庫)的一個組成部分。它包括extern crate聲明use聲明模塊(模塊是一個Item的容器)函數(shù)type定義結(jié)構(gòu)體定義枚舉類型定義常量定義靜態(tài)變量定義Trait定義實(shí)現(xiàn)(Impl) ===================================================================================================================================== 屬性屬性的語法借鑒于C#,看起來像是這樣子的 #[name(arg1, arg2 = "param")]它是由一個#開啟,后面緊接著一個[],里面便是屬性的具體內(nèi)容,它可以有如下幾種寫法:單個標(biāo)識符代表的屬性名,如#[unix]單個標(biāo)識符代表屬性名,后面緊跟著一個=,然后再跟著一個字面量(Literal),組成一個鍵值對,如#[link(name = "openssl")]單個標(biāo)識符代表屬性名,后面跟著一個逗號隔開的子屬性的列表,如#[cfg(and(unix, not(windows)))]在#后面還可以緊跟一個!,比如#![feature(box_syntax)],這表示這個屬性是應(yīng)用于它所在的這個Item。而如果沒有!則表示這個屬性僅應(yīng)用于緊接著的那個Item。===================================================================================================================================== Rust 內(nèi)建了14 類屬性 -------------------------------------------------------------------------------------------------------------------------------------- 1.條件編譯 (針對不同的編譯目標(biāo)來生成不同的代碼,比如在編寫跨平臺模塊時)cfg可接受的條件有:? debug_assertions - 若沒有開啟編譯優(yōu)化時就會成立。? target_arch = "..." - 目標(biāo)平臺的CPU架構(gòu),包括但不限于x86, x86_64, mips, powerpc, arm或aarch64。? target_endian = "..." - 目標(biāo)平臺的大小端,包括big和little。? target_env = "..." - 表示使用的運(yùn)行庫,比如musl表示使用的是MUSL的libc實(shí)現(xiàn), msvc表示使用微軟的MSVC,gnu表示使用GNU的實(shí)現(xiàn)。 但在部分平臺這個數(shù)據(jù)是空的。? target_family = "..." - 表示目標(biāo)操作系統(tǒng)的類別,比如windows和unix。這個屬性可以直接作為條件使用,如#[unix],#[cfg(unix)]。? target_os = "..." - 目標(biāo)操作系統(tǒng),包括但不限于windows, macos, ios, linux, android, freebsd, dragonfly, bitrig, openbsd, netbsd。? target_pointer_width = "..." - 目標(biāo)平臺的指針寬度,一般就是32或64。? target_vendor = "..." - 生產(chǎn)商,例如apple, pc或大多數(shù)Linux系統(tǒng)的unknown。? test - 當(dāng)啟動了單元測試時(即編譯時加了--test參數(shù),或使用cargo test)。例子:#[cfg(target_os = "macos")] 編寫跨平臺模塊時#[cfg(any(foo, bar))] 若條件`foo`或`bar`任意一個成立,則編譯以下的Item #[cfg(not(foo))] 若`foo`不成立時編譯條件編譯屬性只可以應(yīng)用于Item,如果想應(yīng)用在非Item中怎么辦呢?可以使用cfg!宏,如if cfg!(target_arch = "x86") {} else if cfg!(target_arch = "x86_64") {} else if cfg!(target_arch = "mips") {} else {}這種方式不會產(chǎn)生任何運(yùn)行時開銷,因為不成立的條件相當(dāng)于里面的代碼根本不可能被執(zhí)行,編譯時會直接被優(yōu)化掉。cfg_attr例子:[cfg_attr(a, b)] 這表示若a成立,則這個就相當(dāng)于#[cfg(b)]。 -------------------------------------------------------------------------------------------------------------------------------------- 2.測試test - 指明這個函數(shù)為單元測試函數(shù),在非測試環(huán)境下不會被編譯。通過將--test參數(shù)傳遞給rustc 或使用來啟用測試模式cargo test。ignore — 禁用測試功能。該ignore屬性告訴測試工具不要執(zhí)行該功能作為測試。在測試模式下,它仍將被編譯。rustc測試工具支持該--include-ignored標(biāo)志,以強(qiáng)制運(yùn)行忽略的測試。should_panic - 指明這個單元測試函數(shù)必然會panic。該should_panic屬性可以選擇使用必須出現(xiàn)在緊急消息中的輸入字符串。如果在消息中找不到該字符串,則測試將失敗#[test]#[should_panic(expected = "values don't match")]fn mytest() {assert_eq!(1, 2, "values don't match");} -------------------------------------------------------------------------------------------------------------------------------------- 3.派生derive 編譯器提供一個編譯器插件叫作derive,它可以幫你去生成一些代碼去實(shí)現(xiàn)(impl)一些特定的Trait。目前derive僅支持標(biāo)準(zhǔn)庫中部分的Trait舉例:#[derive(Encode, Decode, Clone, Ord, PartialOrd, PartialEq, Eq, Debug, Copy)]詳細(xì)請看:https://github.com/rooat/RustLearn/blob/master/src/appendix-03-derivable-traits.mdautomatically_derived 用于由創(chuàng)建的實(shí)現(xiàn)的標(biāo)記 derive。 -------------------------------------------------------------------------------------------------------------------------------------- 4.宏相關(guān)macro_reexport 應(yīng)用于extern crate上,可以再把這些導(dǎo)入的宏再輸出出去給別的庫使用。macro_export 應(yīng)于在宏上,可以使這個宏可以被導(dǎo)出給別的庫使用。macro_use 把模塊或庫中定義的宏導(dǎo)出來應(yīng)用于mod上,則把此模塊內(nèi)定義的宏導(dǎo)出到它的父模塊中應(yīng)用于extern crate上,則可以接受一個列表,如#[macro_use(debug, trace)]extern crate log;則可以只導(dǎo)入列表中指定的宏,若不指定則導(dǎo)入所有的宏。proc_macro 定義類似函數(shù)的宏proc_macro_derive 定義一個派生宏。proc_macro_attribute 定義屬性宏。 -------------------------------------------------------------------------------------------------------------------------------------- 5.診斷allow, warn, deny, forbid - lint 相關(guān)標(biāo)志開關(guān) (目前的Rust編譯器已自帶的Linter,它可以在編譯時靜態(tài)幫你檢測不用的代碼、死循環(huán)、編碼風(fēng)格等等)? allow(C) - 編譯器將不會警告對于C條件的檢查錯誤。? deny(C) - 編譯器遇到違反C條件的錯誤將直接當(dāng)作編譯錯誤。? forbit(C) - 行為與deny(C)一樣,但這個將不允許別人使用allow(C)去修改。? warn(C) - 編譯器將對于C條件的檢查錯誤輸出警告。支持的C可以通過rustc -W help和默認(rèn)設(shè)置一起找到,并記錄在rustc書中。deprecated 生成棄用通知。must_use 為未使用的值生成lint。 -------------------------------------------------------------------------------------------------------------------------------------- 6.ABI, 鏈接, 符號, 和 FFIlink 說明這個塊需要鏈接一個native庫,它有以下參數(shù):o name - 庫的名字,比如libname.a的名字是name;o kind - 庫的類型,它包括? dylib - 動態(tài)鏈接庫? static - 靜態(tài)庫? framework - OS X里的Frameworklink_name 指定extern塊中函數(shù)或靜態(tài)變量的符號名稱。no_link 應(yīng)用于extern crate上,表示即使我們把它里面的庫導(dǎo)入進(jìn)來了,但是不要把這個庫鏈接到目標(biāo)文件中repr 控制類型布局。crate_type 指定Crate的類型,有以下幾種選擇o "bin" - 編譯為可執(zhí)行文件;o "lib" - 編譯為庫;o "dylib" - 編譯為動態(tài)鏈接庫;o "staticlib" - 編譯為靜態(tài)鏈接庫;o "rlib" - 編譯為Rust特有的庫文件,它是一種特殊的靜態(tài)鏈接庫格式,它里面會含有一些元數(shù)據(jù)供編譯器使用,最終會靜態(tài)鏈接到目標(biāo)文件之中。no_main Disables emitting the main symbol.export_name 指定函數(shù)或靜態(tài)的導(dǎo)出符號名稱。link_pused 強(qiáng)制編譯器在輸出目標(biāo)文件中保留靜態(tài)項。crate_name 指定Crate的名字。如#[crate_name = "my_crate"]則可以讓編譯出的庫名字為libmy_crate.rlibexport_function 用于靜態(tài)變量或函數(shù),指定它們在目標(biāo)文件中的符號名。no_mangle 可以應(yīng)用于任意的Item,表示取消對它們進(jìn)行命名混淆,直接把它們的名字作為符號寫到目標(biāo)文件中。simd 可以用于元組結(jié)構(gòu)體上,并自動實(shí)現(xiàn)了數(shù)值運(yùn)算符,這些操作會生成相應(yīng)的SIMD指令。 -------------------------------------------------------------------------------------------------------------------------------------- 7.代碼生成inline 內(nèi)聯(lián)函數(shù)即建議編譯器可以考慮把整個函數(shù)拷貝到調(diào)用者的函數(shù)體中,而不是生成一個call指令調(diào)用過去。這種優(yōu)化對于短函數(shù)非常有用,有利于提高性能??蛇x的屬性有:#[inline] - 建議編譯器內(nèi)聯(lián)這個函數(shù)#[inline(always)] - 要求編譯器必須內(nèi)聯(lián)這個函數(shù)#[inline(never)] - 要求編譯器不要內(nèi)聯(lián)這個函數(shù)cold 指明這個函數(shù)很可能是不會被執(zhí)行的,因此優(yōu)化的時候特別對待它。no_builtins 禁止使用某些內(nèi)置功能。target_feature 配置特定于平臺的代碼生成。track_caller 將父呼叫位置傳遞到std::panic::Location::caller()。 -------------------------------------------------------------------------------------------------------------------------------------- 8.文檔doc 為這個Item綁定文檔,跟///的功能一樣,用法是#[doc = "This is a doc"]struct Foo {} -------------------------------------------------------------------------------------------------------------------------------------- 9.預(yù)引入no_std Removes std from the prelude.no_implicit_prelude 取消自動插入use std::prelude::*。 -------------------------------------------------------------------------------------------------------------------------------------- 10.模塊path如聲明mod a;,則尋找本文件夾下的a.rs文件本文件夾下的a/mod.rs文件#[cfg(unix)]#[path = "sys/unix.rs"]mod sys;#[cfg(windows)]#[path = "sys/windows.rs"]mod sys; -------------------------------------------------------------------------------------------------------------------------------------- 11.限制recursion_limit 設(shè)置某些編譯時操作的最大遞歸限制。默認(rèn)rustc值為128。type_length_limit 設(shè)置了在單態(tài)化期間構(gòu)造具體類型時進(jìn)行類型替換的最大數(shù)量。默認(rèn)rustc值為1048576。 -------------------------------------------------------------------------------------------------------------------------------------- 12.運(yùn)行時panic_handler 設(shè)置處理恐慌的功能。global_allocator 設(shè)置全局內(nèi)存分配器。windows_subsystem 指定要鏈接的Windows子系統(tǒng)。 -------------------------------------------------------------------------------------------------------------------------------------- 13.語言特性feature 在非穩(wěn)定版的Rust編譯器中,可以使用一些不穩(wěn)定的功能,比如一些還在討論中的新功能、正在實(shí)現(xiàn)中的功能等。Rust編譯器提供一個應(yīng)用于Crate的屬性feature來啟用這些不穩(wěn)定的功能具體有哪些特性詳細(xì)請看:https://doc.rust-lang.org/unstable-book/ -------------------------------------------------------------------------------------------------------------------------------------- 14.類型系統(tǒng)non_exhaustive 表示類型將來會添加更多字段/變量。===================================================================================================================================== 應(yīng)用于模塊的屬性no_implicit_preludepath -------------------------------------------------------------------------------------------------------------------------------------- 應(yīng)用于crate的屬性? crate_name ? crate_type ? feature ? no_builtins - 去掉內(nèi)建函數(shù)。? no_main- 不生成main這個符號,當(dāng)你需要鏈接的庫中已經(jīng)定義了main函數(shù)時會用到。? no_start - 不鏈接自帶的native庫。? no_std - 不鏈接自帶的std庫。? plugin - 加載編譯器插件,一般用于加載自定義的編譯器插件庫。#![plugin(foo, bar)] // 加載foo, bar兩個插件#![plugin(foo(arg1, arg2))] // 或者給插件傳入必要的初始化參數(shù)? recursive_limit - 設(shè)置在編譯期最大的遞歸層級。比如自動解引用、遞歸定義的宏等。默認(rèn)設(shè)置是#![recursive_limit = "64"] -------------------------------------------------------------------------------------------------------------------------------------- 應(yīng)用于函數(shù)的屬性? main - 把這個函數(shù)作為入口函數(shù),替代fn main,會被入口函數(shù)(Entry Point)調(diào)用。? plugin_registrar - 編寫編譯器插件時用,用于定義編譯器插件的入口函數(shù)。? start - 把這個函數(shù)作為入口函數(shù)(Entry Point),改寫 start language item。不再執(zhí)行標(biāo)準(zhǔn)庫中的初始化流程? test ? should_panic? cold -------------------------------------------------------------------------------------------------------------------------------------- 應(yīng)用于FFI的屬性extern塊可以應(yīng)用以下屬性? link_args - 指定鏈接時給鏈接器的參數(shù),平臺和實(shí)現(xiàn)相關(guān)。? link 在extern塊里面,可以使用link_namelinkage - 對于全局變量,可以指定一些LLVM的鏈接類型( http://llvm.org/docs/LangRef.html#linkage-types )。對于enum類型,可以使用repr - 目前接受C,C表示兼容C ABI。#[repr(C)]enum eType {Operator,Indicator,}對于struct類型,可以使用repr - 目前只接受C和packed,C表示結(jié)構(gòu)體兼容C ABI,packed表示移除字段間的padding。 --------------------------------------------------------------------------------------------------------------------------------------

?

總結(jié)

以上是生活随笔為你收集整理的37.rust属性.txt的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。