为何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
相关产品推荐
相关产品推荐

