rust属性

一、属性是什么

属性是一种由编译器使用的元数据。

二、属性语法

内部属性以 #! 开头,应用于包含它的程序项。

复制代码
   #![ 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 = ();
}

三、属性分类

(一)内置属性

所有内置属性:

复制代码
    条件编译(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"。

复制代码
// 告诉rustfmt工具不要格式化以下元素。
#[rustfmt::skip]
struct S {
}
// 控制clippy工具的"圈复杂度"极限值。
#[clippy::cyclomatic_complexity = "100"]
pub fn f() {}
相关推荐
用户8356290780511 分钟前
Python 自动化 Word 文本框处理:创建、定位、填充内容与管理
后端·python
网渡科技13 分钟前
向量数据库选型指南:RAG场景下的性能对比与调优策略
后端
汉字萌萌哒29 分钟前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
riverNijika33 分钟前
项目学习笔记:C++基础同步输出日志库
后端
叠层归一研究院35 分钟前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
Lyra_Infra38 分钟前
OpenClaw 升级及 Channel 安装故障排查与遗留问题分析
后端·npm
江小渔44 分钟前
训练工程与训练平台入门 31 安装 Kubeflow Trainer,并跑第一个 TrainJob
后端
用户938515635071 小时前
从 0 拆解一个 Next.js 笔记系统:npx、App Router、RSC 与组件规划全记录
前端·后端·全栈
小雨笙笙1 小时前
C语言:变量三属性——存储类型
c语言·开发语言
fatcoder1 小时前
玩转Docker 06 — 容器网络
前端·后端·docker