ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Rust 中禁用未使用的代码警告?

struct SemanticDirection;

fn main() {}
warning: struct is never used: `SemanticDirection`
 --> src/main.rs:1:1
  |
1 | struct SemanticDirection;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

对于任何严重的事情,我都会重新打开这些警告,但我只是在修改语言,这让我很生气。

我尝试将 #[allow(dead_code)] 添加到我的代码中,但这不起作用。


S
Serid

您可以:

在结构、模块、函数等上添加允许属性:#[allow(dead_code)] struct SemanticDirection;

添加 crate 级别的 allow 属性;注意 !: #![allow(dead_code)]

将其传递给 rustc: rustc -A dead_code main.rs

通过 RUSTFLAGS 环境变量使用 cargo 传递它: RUSTFLAGS="$RUSTFLAGS -A dead_code" cargo build


请注意,最后一个将触发所有内容的重新编译。
最后一个效果最好的IMO。此外,添加 -A unused_variables 有助于防止将 _ 放在所有内容的前面。
#![allow(dead_code)] 还必须在任何代码之前进行,否则 rust 会产生一些神秘的错误。
S
Shepmaster

禁用此警告的另一种方法是在标识符前面加上 _

struct _UnusedStruct {
    _unused_field: i32,
}

fn main() {
    let _unused_variable = 10;
}

这可能很有用,例如,对于 SDL 窗口:

let _window = video_subsystem.window("Rust SDL2 demo", 800, 600);

使用下划线作为前缀不同于使用单独的下划线作为名称。执行以下操作将立即破坏窗口,这不太可能是预期的行为。

let _ = video_subsystem.window("Rust SDL2 demo", 800, 600);

“分配给下划线会破坏它”的行为似乎很奇怪(尽管我不怀疑你是正确的)。你有它的参考吗?
@MichaelAnderson 请参阅“RAII。您可能希望存在一个变量以实现其析构函数的副作用,但不要使用它。对于此用例,不能简单地使用 _ ,因为 _ 不是变量绑定和值将在语句末尾删除。”来自stackoverflow.com/a/48361729/109618
使用 let _ = 值将在语句的末尾被删除,而不是在块的末尾
如果您想了解更多关于原因的信息,原因是 let X = Y 中的 X 是一个无可辩驳的模式(即,它就像一个 match 手臂,可以在编译时证明永远不会出错),并且,就像可反驳的模式,_ 是一个通配符,它不会将任何内容绑定到变量。这就是为什么以及如何进行 let (x, y) = foo(); 和其他类似的拆包。这只是另一种无可辩驳的模式。
M
M. Hamza Rajput

将这两行放在文件的顶部。

#![allow(dead_code)]
#![allow(unused_variables)]

这两者有什么区别? #[allow(dead_code)] 无效,但 #![allow(dead_code)] 有效。
@jwkoo !使其适用于整个箱子
替换为 #![allow(dead_code, unused)] ;-)
V
Victor Basso

将代码设为 public 也会停止警告;您还需要公开封闭的 mod

这在您编写库时是有道理的:您的代码在内部是“未使用的”,因为它旨在供客户端代码使用。


我认为如果 crate 包含 main.rs 和 lib.rs 并且 main.rs 不使用所讨论的函数,这将不起作用。
M
Muhammed Moussa

另外:rust 提供了四个级别的 lints(允许、警告、拒绝、禁止)。

https://doc.rust-lang.org/rustc/lints/levels.html#lint-levels


c
crimsondamask

您始终可以通过在变量名称中添加 (_) 来禁用未使用的变量/函数,如下所示:

let _variable = vec![0; 10];

antoyo 的回答已经涵盖了这种方法。
P
PPP

对于未使用的函数,您应该公开该函数,但要小心。如果结构不是公开的,那么您仍然会收到如下错误:

//this should be public also
struct A{
   A{}
}

impl A {
    pub fn new() -> A {

    }
}

或者,如果您不希望它公开,您应该输入 #[allow(unused)]


d
davidsbro

使用特征

#[cfg(feature = "dead_code")]

注意:"dead_code" 可以替换为任何单词。


我从未见过像这样使用 cfg/feature。你能解释一下这是如何工作的,或者它是否记录在某个地方?