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