Rust #[] 语法
在 Rust 中,#[]
语法用于 属性(Attributes),这是一种特殊的元数据注解,用于向编译器提供额外信息或修改代码的行为。它们类似于其他语言中的注解(如 Java)或装饰器(如 Python)。
核心概念
基本形式:
外部属性:
#[attr]
(应用于后面的代码项)内部属性:
#![attr]
(应用于整个作用域,如模块或 crate)
常见用途:
条件编译(
#[cfg]
)禁用编译器警告(
#[allow]
)实现 trait(
#[derive]
)标记测试函数(
#[test]
)配置优化(
#[inline]
)链接外部库(
#[link]
)
深入示例解析
1. 条件编译 #[cfg]
#[cfg(target_os = "linux")]
fn linux_only() {println!("Running on Linux!");
}#[cfg(not(target_os = "linux"))]
fn not_linux() {println!("Not on Linux!");
}
作用:只在特定平台/条件下编译代码
等价命令:
rustc --cfg 'target_os="linux"'
2. 派生 Trait #[derive]
#[derive(Debug, Clone, PartialEq)]
struct Point {x: i32,y: i32,
}
效果:自动实现
Debug
(打印)、Clone
(克隆)、PartialEq
(比较)等 trait原理:编译器生成默认实现代码
3. 禁用警告 #[allow]
#[allow(dead_code)] // 忽略"未使用代码"警告
fn unused_function() {}
4. 测试函数 #[test]
#[test]
fn test_addition() {assert_eq!(2 + 2, 4);
}
运行测试:
cargo test
标记为测试的函数会被编译进单独的可执行文件
5. 内联优化 #[inline]
#[inline(always)] // 强制内联展开
fn add(a: i32, b: i32) -> i32 {a + b
}
特殊属性
属性 | 作用 | 示例 |
---|---|---|
#[no_mangle] | 禁用名称修饰(用于 FFI) | #[no_mangle] pub extern fn |
#[repr(C)] | 指定 C 兼容内存布局 | #[repr(C)] struct Data |
#![feature] | 启用实验性功能(仅 nightly) | #![feature(specialization)] |
#![crate_type] | 指定 crate 类型(lib/bin) | #![crate_type = "lib"] |
自定义属性(高级)
通过过程宏可创建自定义属性:
// 自定义属性宏(需在单独 crate 中定义)
#[proc_macro_attribute]
pub fn log_call(_attr: TokenStream, item: TokenStream) -> TokenStream {// 自动插入日志代码let input = parse_macro_input!(item as ItemFn);/* ...生成新代码... */
}
使用示例:
#[log_call]
fn expensive_calculation() { ... }
// 编译时会自动插入日志代码
最佳实践
优先使用标准属性(如
derive
、cfg
)谨慎使用
unsafe
相关属性(如repr
)避免过度使用
inline
(编译器通常能更好决策)条件编译时提供兜底实现 提升可移植性
属性是 Rust 元编程的核心工具之一,合理使用可以极大提升代码的表达力和灵活性,同时保持安全性。