我注意到,为了使一段代码不被分类为无效代码,必须从所有二进制文件中都可以访问该代码。例子:
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的输出也被这些警告所淹没。是否有解决方案至少可以在全球范围内抑制死代码?应避免使用货物工作区对整个项目进行重组。
发生这种情况是因为您不只编译utils.rs
一次,而是编译了两次,首先作为的一部分,main_one
然后作为的一部分main_two
。
我熟悉的模式是将通用项放入lib.rs
,默认情况下将其编译成与您的项目同名的库箱。然后,不要使用来将它们包含在每个二进制文件中mod
,只需使用库箱即可。
# Cargo.toml
[package]
name = "my_crate" # <- will be the name of the library crate
version = "0.1.0"
[dependencies]
# No need for [[bin]] sections if you put the binary sources in src/bin
// src/lib.rs
pub fn function_in_question() {
println!("world!");
}
// src/bin/main_one.rs
fn main() {
print!("Hello, ");
my_crate::function_in_question();
}
// src/bin/main_two.rs
fn main() {
print!("Hello, ");
// my_crate::function_in_question();
}
库箱仅被编译一次,并且由于function_in_question
是箱的公共API的一部分,因此您不会看到任何无效代码警告。
请注意,如果将二进制文件放入[[bin]]
,Cargo.toml
则不需要src/bin
;看到这个问题更多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句