You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何cargo-expand未展开Rust宏中嵌套的宏?

问题

我正在学习Rust,尝试对默认的Hello, World程序使用cargo-expand工具。据我理解,它应展开所有宏,但使用后发现仍保留了由其他宏生成的format_args!宏。

展开后的代码如下:

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
fn main() {
    {
        ::std::io::_print(format_args!("Hello, World\n"));
    };
}

我原本以为cargo-expand的输出会展开所有内容,因此感到困惑。我尝试搜索答案,但看到的示例输出中都没有宏残留。请问这种情况是否正常?

回答

这种情况完全正常,核心原因如下:

  • format_args!是编译器内置宏,不属于普通的Rust宏范畴。cargo-expand只能展开由Rust代码定义的宏(包括标准库中用Rust编写的宏),但无法处理编译器本身内置的特殊宏。
  • println!这类常用打印宏,展开后最终都会调用format_args!——它是Rust格式化系统的底层核心,负责将格式化字符串和参数转换为供打印使用的内部结构,这部分逻辑由编译器直接处理,不需要再展开成普通Rust代码。
  • 你看到的示例输出没有宏残留,大概率是那些示例未涉及到format_args!这一层,或者示例中的宏没有依赖这个内置宏。

总结来说,cargo-expand的能力范围是展开用户定义或标准库中用Rust编写的宏,编译器内置宏不在它的处理范围内,所以输出中保留format_args!是完全合理的。

内容的提问来源于stack exchange,提问作者Rock48

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:32:12