rust语言内置属性

Rust 语言中的属性(Attributes)是附加到代码(例如模块、函数、结构体、枚举或整个 crate)上的元数据,用于向编译器提供额外信息、指示编译器执行特定操作,或启用某些功能
属性以 #[attribute_name](表示该属性作用于紧接着它的下一个声明项(Item Declaration) #! [attribute_name](应用于包含它的项目,如模块或 crate 根目录)的形式出现。
也就是说有感叹号的属性作用于该rs文件,而没有感叹号的仅作用于紧邻的下一个声明项。
以下是一些 Rust 中最常用和重要的属性:

1. 自动实现 Trait

这是日常 Rust 编程中使用最频繁的属性之一。它指示编译器自动为你的类型生成 Trait 的实现代码。
 
属性作用常用 Traits
#[derive(...)] 自动为类型实现指定的 Trait DebugCloneCopyPartialEqEqHashDefault
示例:
#[derive(Debug, Clone, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

2. 测试与条件编译

用于控制代码的编译方式,特别是用于测试代码。
 
属性作用
#[test] 标记一个函数为测试函数。
#[cfg(...)] 控制是否编译其所附着的代码块。
#[cfg(test)] #[cfg] 的一种常见用法,仅在运行测试时编译代码。
#[ignore] 在运行测试时忽略此测试用例。
示例:
#[cfg(test)] // 整个模块只在测试时编译
mod tests {
    #[test] // 这是一个测试函数
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}

3. 控制编译器行为(Linting)

用于抑制或启用特定的编译器警告或错误。
 
属性作用
#[allow(...)] 允许指定的警告(忽略它)。
#[warn(...)] 将指定的警告级别设置为警告。
#[deny(...)] 将指定的警告级别提升为错误。
#[forbid(...)] 比 deny 更严格,不允许任何绕过的方式。
常用linting属性补充

1)#[allow(non_snake_case)]

Rust 编译器默认开启 non_snake_case 检查(Lint),要求变量、函数、方法和模块的名称必须使用 小写加下划线 的形式(例如 my_variable 而不是 myVariable)。如果违反这一约定,编译器会发出警告。使用该属性可以强制关闭这些警告。

2)#[allow(unused_variables)]

示例:
// 允许使用未使用的变量警告,只针对这个函数
#[allow(unused_variables)] 
fn my_function(x: i32) {
    let y = 10; // y 不会触发警告
}

3)#[allow(unused_unsafe)]

它是一个编译器属性(Lint Check),它的作用是:告诉编译器忽略那些“实际上不需要 unsafe 块,但却写了 unsafe 块”的代码警告。

4)#![cfg_attr(feature = "strict", deny(warnings))]

语义拆解:
  • #! (Inner Attribute):作用于整个当前文件或整个 Crate(通常放在 lib.rs 或 main.rs 的最顶部)。
  • cfg_attr(...):条件属性。只有当满足第一个参数的条件时,才会应用第二个参数。
  • feature = "strict":条件。检查 Cargo 是否开启了名为 strict 的特性(Feature)。
  • deny(warnings):操作。将所有的编译警告(Warnings)提升为编译错误(Errors)。
这行代码的逻辑是:“如果我在编译时开启了 strict 特性,那么一旦代码中出现任何警告,编译就必须立刻失败。”

4. 宏相关

用于定义和导出自定义宏。
 
属性作用
#[macro_export] 使声明式宏 (macro_rules!) 可以在其他 crate 中使用。
#[proc_macro] 标记一个函数为过程宏(需要单独的 crate)。

4.1 rust语言属性#[macro_export]

示例:
#[macro_export]
macro_rules! my_macro {
    () => { println!("Hello!"); };
}

5. FFI(外部函数接口)相关

在与 C 或其他语言进行交互时,这些属性非常关键。
 
属性作用
#[no_mangle] 告诉编译器不要“混淆”此函数的名称,使其可以被外部 C/C++ 代码找到。
#[repr(C)] 强制结构体使用 C 语言兼容的内存布局。
#[link(...)] 链接到外部库。
#[export_name = "..."] 为函数指定一个特定的导出名称。

5.1 rust语言属性#[repr(c)]

示例:
#[no_mangle]
pub extern "C" fn call_from_c() {
    // ...
}

#[repr(C)]
struct CStruct {
    field1: u32,
    field2: f64,
}

6. 优化与文档

 
属性作用
#[inline] 建议编译器进行函数内联优化。
#[doc = "..."] 文档注释的底层属性。
示例:
#[inline(always)] // 强制编译器始终内联此函数
fn get_zero() -> i32 {
    0
}
 相关资料
 
 
posted @ 2025-12-05 16:14  PKICA  阅读(32)  评论(0)    收藏  举报