【问题标题】:Dead code warning with multiple binaries?带有多个二进制文件的死代码警告?
【发布时间】:2021-02-14 13:25:02
【问题描述】:

我注意到,为了不将一段代码归类为死代码,它必须可以从所有二进制文件中访问。示例:

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 的输出被这些警告发送了垃圾邮件。有没有一种解决方案可以至少在全球范围内抑制死代码检测?应避免使用货物工作空间重构整个项目。

【问题讨论】:

  • 要在全球范围内消除警告,请参阅this answer
  • @pretzelhammer 好的,将 #![allow(dead_code)] 添加到每个二进制入口点文件的顶部可以使警告静音。不过,我同意您的评论,认为这不是一个可靠的解决方案。
  • #![allow(dead_code] 添加到主源文件的顶部,而不是Cargo.toml。是的,正如我之前所说,我仍然希望看到一个正确解决这个问题的答案,因为全局静音一个有用的警告只是避免了这个问题(并在这个过程中创建了另一个)。

标签: rust rust-cargo rust-clippy


【解决方案1】:

发生这种情况是因为您没有只编译一次 utils.rs - 您编译了两次,首先是作为 main_one 的一部分,然后是作为 main_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();
}

库 crate 只会编译一次,因为 function_in_question 是 crate 的公共 API 的一部分,所以您不会看到死代码警告。

请注意,如果将二进制文件放在src/bin 中,则不需要Cargo.toml 中的[[bin]] 部分;更多信息请参见this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多