rust 多个二进制文件的死代码警告?

k2fxgqgv  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(122)

我注意到,为了使一段代码不被归类为死代码,它必须可以从所有二进制文件访问。范例:
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的输出被这些警告所垃圾化。有没有一种解决方案,至少可以在全球范围内抑制死代码检测?应避免用货物装卸对整个项目进行重组。

e5nszbig

e5nszbig1#

这是因为您不是只编译utils.rs一次--而是编译了两次,第一次是作为main_one的一部分,然后是作为main_two的一部分。
我熟悉的模式是将公共项放入lib.rs中,默认情况下,lib.rs被编译到与项目同名的库crate中。然后,不用在每个二进制文件中包含mod,而只需使用库crate。

# 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();
}

库crate将只编译一次,并且因为function_in_question是crate的公共API的一部分,所以您不会看到死代码警告。
请注意,如果将二进制文件放在src/bin中,则不需要Cargo.toml中的[[bin]]节; this question更多

相关问题