rust语言属性#[macro_export]

#[macro_export] 是 Rust 语言中的一个属性(Attribute)用于标记一个宏,使其可以从当前 crate(库)导出,从而可以在其他 crate 中使用

1. 作用与目的

在 Rust 中,如果你在一个库 crate 中定义了一个宏(通常是使用 macro_rules! 定义的声明式宏),默认情况下,该宏只能在该 crate 内部使用。
使用 #[macro_export] 属性可以改变这种可见性:
  • 默认状态: 宏是私有的,只在当前 crate 的模块树中可见。
  • 使用 #[macro_export]: 宏被提升到 crate 的根模块,并可以在依赖于此 crate 的其他代码库中被导入和使用。

2. 使用场景

主要用于开发公共库时,需要向用户提供自定义的、可重用的宏。

3. 使用示例

假设你有一个名为 my_utils 的库项目。
my_utils/src/lib.rs
你在这里定义并导出一个简单的宏:
// my_utils/src/lib.rs

/// 导出一个简单的打印宏
#[macro_export] // <-- 关键属性
macro_rules! say_hello {
    () => {
        println!("Hello from my_utils macro!");
    };
}

// 库中必须至少有一个非宏的公共项,否则宏可能无法正确导出
pub fn placeholder() {}
在另一个项目中使用(your_app/src/main.rs
在另一个依赖于 my_utils 的应用项目中,你需要将 my_utils 添加到 Cargo.toml 中,然后就可以使用 use 语句导入这个宏:
// your_app/src/main.rs

// 导入 my_utils crate 的 say_hello 宏
use my_utils::say_hello; 

fn main() {
    say_hello!(); // 调用导出的宏
}

4. 注意事项

  • 模块可见性: #[macro_export] 会将宏放置在一个特殊的、全局可用的位置。即使宏是在私有模块中定义的,它依然可以被导出。
  • Rust 2018+ 版本: 在现代 Rust(2018 版本及以后)中,使用导出的宏就像使用常规函数一样,使用标准的 use 路径即可。在旧版本中(2015及以前),需要使用 #[macro_use] 属性来引入整个 crate 的宏,但现在已不推荐这种做法。

 

posted @ 2025-12-05 10:25  PKICA  阅读(4)  评论(0)    收藏  举报