一、属性是什么
属性是一种由编译器使用的元数据。
二、属性语法
内部属性以 #! 开头,应用于包含它的程序项。
#![ Attr ]
外部属性以# 开头,应用于属性后面的内容。
#[ Attr ]
Attr可以是以下形式
IDENTIFIER
IDENTIFIER = (STRING_LITERAL | RAW_STRING_LITERAL)
IDENTIFIER ( ( IDENTIFIER (, IDENTIFIER)* ,? )? )
IDENTIFIER ( ( MetaNameValueStr (, MetaNameValueStr)* ,? )? )
例子:
#![crate_type = "lib"]
// 标记为单元测试的函数
#[test]
fn test_foo() {
/* ... */
}
// 一个条件编译模块
#[cfg(target_os = "linux")]
mod bar {
/* ... */
}
// 用于静音lint检查后报告的告警和错误提醒
#[allow(non_camel_case_types)]
type int8_t = i8;
// 适用于整个函数的内部属性
fn some_unused_variables() {
#![allow(unused_variables)]
let x = ();
let y = ();
let z = ();
}
三、属性分类
(一)内置属性
所有内置属性:文章来源:https://www.toymoban.com/news/detail-725394.html
条件编译(Conditional compilation)
cfg — 控制条件编译。
cfg_attr — 选择性包含属性。
测试(Testing)
test — 将函数标记为测试函数。
ignore — 禁止测试此函数。
should_panic — 表示测试应该产生panic。
派生(Derive)
derive — 自动部署trait实现
automatically_derived — 用在由derive创建的实现上的标记。
宏(Macros)
macro_export — 导出声明宏(macro_rules宏),用于跨crate的使用。
macro_use — 扩展宏可见性,或从其他crate导入宏。
proc_macro — 定义类函数宏。
proc_macro_derive — 定义派生宏。
proc_macro_attribute — 定义属性宏。
诊断(Diagnostics)
allow、warn、deny、forbid — 更改默认的lint检查级别。
deprecated — 生成弃用通知。
must_use — 为未使用的值生成lint提醒。
ABI、链接(linking)、符号(symbol)、和FFI
link — 指定要与外部(extern)块链接的本地库。
link_name — 指定外部(extern)块中的函数或静态项的符号(symbol)名。
no_link — 防止链接外部crate。
repr — 控制类型的布局。
crate_type — 指定crate的类别(库、可执行文件等)。
no_main — 禁止发布main符号(symbol)。
export_name — 指定函数或静态项导出的符号(symbol)名。
link_section — 指定用于函数或静态项的对象文件的部分。
no_mangle — 禁用对符号(symbol)名编码。
used — 强制编译器在输出对象文件中保留静态项。
crate_name — 指定crate名。
代码生成(Code generation)
inline — 内联代码提示。
cold — 提示函数不太可能被调用。
no_builtins — 禁用某些内置函数。
target_feature — 配置特定于平台的代码生成。
track_caller - 将父调用位置传递给std::panic::Location::caller()。
文档(Documentation)
doc— 指定文档。更多信息见 The Rustdoc Book。Doc注释会被转换为doc属性。
预导入包(Preludes)
no_std — 从预导入包中移除std。
no_implicit_prelude — 禁用模块内的预导入包查找。
模块(Modules)
path — 指定模块的源文件名。
极限值设置(Limits)
recursion_limit — 设置某些编译时操作的最大递归限制。
type_length_limit — 设置多态类型(polymorphic type)单态化过程中构造具体类型时所做的最大类型替换次数。
运行时(Runtime)
panic_handler — 设置处理panic的函数。
global_allocator — 设置全局内存分配器。
windows_subsystem — 指定要链接的windows子系统。
特性(Features)
feature— 用于启用非稳定的或实验性的编译器特性。参见 The Unstable Book 了解在rustc中实现的特性。
类型系统(Type System)
non_exhaustive — 表明一个类型将来会添加更多的字段/变体。
(二)宏属性
(三)派生宏辅助属性
(四)外部工具属性
由外部工具使用的属性,这些工具必须存在。
这种属性的路径的第一段是工具的名称。
如果使用了 no_implicit_prelude属性,则外部工具属性不可用。
目前能识别的工具是 “clippy” 和 “rustfmt”。文章来源地址https://www.toymoban.com/news/detail-725394.html
// 告诉rustfmt工具不要格式化以下元素。
#[rustfmt::skip]
struct S {
}
// 控制clippy工具的“圈复杂度”极限值。
#[clippy::cyclomatic_complexity = "100"]
pub fn f() {}
到了这里,关于rust属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!