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

10
我注意到为了避免代码被视为死代码,它必须能够从所有二进制文件中访问到。例如:
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的输出被这些警告淹没时,这非常烦人。是否有解决方案至少可以全局禁用死代码检测?应避免使用cargo工作区重新组织整个项目。

1
要全局禁止警告,请参考此答案 - pretzelhammer
@pretzelhammer 好的,将 #![allow(dead_code)] 添加到每个二进制入口文件的顶部可以消除警告。然而,我同意你的评论,认为这不是一个稳妥的解决方案。 - Vilda
2
在你的主源文件顶部添加 #![allow(dead_code)],而不是在 Cargo.toml 文件中添加。正如我之前所说,我仍然希望看到一个解决此问题的正确方法的答案,因为全局静默一个本来有用的警告只会规避问题(并在此过程中创建另一个问题)。 - pretzelhammer
1个回答

14

这是因为你没有仅编译一次 utils.rs 文件 -- 你将它作为 main_onemain_two 的一部分分别编译了两次。

我熟悉的模式是将通用项放入 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();
}

库箱将仅编译一次,并且因为function_in_question是箱的公共API的一部分,所以您不会看到任何死代码警告。

请注意,如果将二进制文件放在src/bin中,则不需要在Cargo.toml中使用[[bin]]节;有关更多信息,请参见此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接