我注意到,为了使一段代码不被归类为死代码,它必须可以从所有二进制文件访问。范例:
Cargo.toml:
[[bin]]
name = "main_one"
path = "src/main_one.rs"
[[bin]]
name = "main_two"
path = "src/main_two.rs"
main_one.rs:
mod utils;
fn main() {
print!("Hello, ");
utils::function_in_question();
}
main_two.rs:
mod utils;
fn main() {
print!("Hello, ");
// utils::function_in_question();
}
utils.rs:
pub fn function_in_question() {
println!("world!");
}
这将function_in_question
报告为死代码,即使它可以从main_one.rs
访问。取消注解可以解决这个问题。如果它只存在于main_two.rs
中也有效。
虽然这种行为背后有一定的道理,但VSCode一直抱怨这一点是很有必要的,Clippy的输出被这些警告所垃圾化。有没有一种解决方案,至少可以在全球范围内抑制死代码检测?应避免用货物装卸对整个项目进行重组。
1条答案
按热度按时间e5nszbig1#
这是因为您不是只编译
utils.rs
一次--而是编译了两次,第一次是作为main_one
的一部分,然后是作为main_two
的一部分。我熟悉的模式是将公共项放入
lib.rs
中,默认情况下,lib.rs
被编译到与项目同名的库crate中。然后,不用在每个二进制文件中包含mod
,而只需使用库crate。库crate将只编译一次,并且因为
function_in_question
是crate的公共API的一部分,所以您不会看到死代码警告。请注意,如果将二进制文件放在
src/bin
中,则不需要Cargo.toml
中的[[bin]]
节; this question更多