rust 通过两阶段的宏实现了类型安全的变长参数:
print!() / println!()这样的声明宏 (macro_rules!):使用 $(...)* 语法在宏层面捕获任意数量的参数(Token)。
然后用编译器内置的 format_args! 宏在编译时解析格式化字符串、校验参数类型和数量,并将所有参数“打包”成一个单一的 std::fmt::Arguments 结构体。
最终完成任务的函数层面 (例如stdio::print):是一个普通的、非变长的函数接收这个 Arguments 结构体来完成实际工作。
做样就把 C 语言 printf 的运行时风险(例如 printf("%s", 10) 导致的未定义行为)完全转移到了 Rust 的编译时进行核查和规避,实现了它闻名遐迩的内存安全和类型安全。
【 在 gameplayer 的大作中提到: 】
: rust函数不支持变长参数列表,没有办法用传统的printf那种函数
:
--
FROM 123.120.4.*