为什么Rust会对仅在测试中使用的函数报未使用警告?如何解决?
原因说明
Rust 的dead_code代码检查默认开启,判断逻辑基于当前编译目标下的代码调用关系:
- 标注了
#[cfg(test)]的测试模块,仅在执行测试编译(cargo test)时会被纳入编译流程。常规的cargo build、cargo check等非测试编译操作,会完全忽略测试模块内的所有代码。 - 示例中的
greet函数没有对外公开(无pub修饰),编译器默认仅检查当前 crate 内的调用情况。非测试编译时测试模块被排除,编译器看不到greet被调用的逻辑,因此判定为死代码触发警告。
解决方法
根据函数的实际用途选择对应方案即可:
- 若该函数仅用于测试场景:给函数也添加
#[cfg(test)]标注,让它只在测试编译时存在,自然不会在常规编译时触发警告。
代码示例:#[cfg(test)] fn greet() { println!("Hello!") } #[cfg(test)] mod tests { use super::*; #[test] fn test_greet() { greet(); } } - 若该函数是待后续实现调用的业务函数,暂时不需要对外暴露:给函数添加
#[allow(dead_code)]标注,手动关闭该函数的死代码检查。
代码示例:#[allow(dead_code)] fn greet() { println!("Hello!") } - 若该函数是设计为对外提供的库接口:给函数添加
pub修饰符将其公开。Rust不会对公开导出的函数做死代码检查,因为编译器无法判断外部 crate 是否会调用该函数。
代码示例:pub fn greet() { println!("Hello!") } - 若仅需要临时做代码检查不想修改代码:执行
cargo check --tests命令,该命令会将测试模块纳入编译范围,编译器可以检测到测试中的函数调用,不会触发死代码警告。
内容的提问来源于stack exchange,提问作者Andrey Bienkowski
相关产品推荐
相关产品推荐

