Rust:同一段代码在两个项目中编译一个报警告一个报错的原因咨询
为什么相同Rust代码在两个项目中编译结果不同(警告vs错误)?
这是因为两个项目使用了不同的Rust Edition,而Rust 2021对panic!宏的用法做了严格限制。
核心原因
你的代码里的panic!(e)写法在不同Edition下的处理规则不一样:
- 在Rust 2018 Edition中,这种直接传递非字符串字面量给
panic!的行为只是一个警告(对应你第一个项目的输出),默认开启#[warn(non_fmt_panics)]。 - 在Rust 2021 Edition中,这个规则被升级成了硬错误,直接导致编译失败(对应你第二个项目的输出)。
Rust Edition是Cargo项目的一个配置项,决定了语言特性的启用和行为规则——即使使用相同版本的rustc/cargo,不同Edition的项目也会有不同的编译行为。
如何验证?
检查两个项目根目录下的Cargo.toml文件,找到edition字段:
- 第一个项目(触发警告)的
edition应该是2018 - 第二个项目(触发错误)的
edition应该是2021
解决方法
你有两种选择来统一两个项目的编译行为:
- 修改代码以符合Edition要求(推荐):
按照编译器提示的两种方式调整die函数:// 方式1:使用格式化字符串打印错误信息 fn die(e: std::io::Error) { panic!("{}", e); } // 方式2:使用panic_any直接抛出任意类型的值 fn die(e: std::io::Error) { std::panic::panic_any(e); } - 统一两个项目的Edition:
把两个项目的Cargo.toml中的edition字段改成相同的值(比如都设为2018或2021),这样编译行为就会完全一致。
内容的提问来源于stack exchange,提问作者Thomas S.
相关产品推荐
相关产品推荐

