#![deny(warnings)]

说明

一个善意的库作者想要确保他们的代码在编译时不会产生警告。因此他们在库里标注以下内容:

示例

#![allow(unused)]
#![deny(warnings)]

fn main() {
// 一切安好
}

优点

它很短,如果有什么错误就停止编译。

缺点

通过禁用编译器生成警告,库的作者放弃了Rust的稳定性。有时新的特性或者旧的不合格的特性需要被更改,因此,将会在一段宽限期内给出警告,之后变成禁用。

举例来说,一个类型可以有两个具有相同方法的实现。这被认为是一个坏主意,但是为了顺利过渡,引入 overlapping-inherent-impls提示来警告那些在将来版本中出现严重错误的人。

而且有时API会被弃用,所以使用它们会发出警告。

所有的这些在改变时都可能破坏编译过程。

此外,除非这个删除注释,否则不能再使用提供额外警告的库。(例如rust-clippy)这可以通过--cap-lints缓解。--cap-lints=warn命令行参数将所有的deny提示的错误转换为警告。

替代方案

解决这个问题有两种方法:第一种,我们可以将编译设置与代码解耦;第二种,我们可以显式地命名要拒绝的警告。

下面这个命令行参数将会带着所有关闭的警告进行编译:

RUSTFLAGS="-D warnings" cargo build

任何独立开发者都可以这样做(或者设置到持续集成工具,如Travis,但是记住当某些内容发生变化时,可能会破坏编译)。

或者,我们可以指定我们想要在代码中关闭的警告。下面是警告提示列表(Rustc 1.48.0):

#[deny(bad-style,
       const-err,
       dead-code,
       improper-ctypes,
       non-shorthand-field-patterns,
       no-mangle-generic-items,
       overflowing-literals,
       path-statements ,
       patterns-in-fns-without-body,
       private-in-public,
       unconditional-recursion,
       unused,
       unused-allocation,
       unused-comparisons,
       unused-parens,
       while-true)]

此外,下面的提示是推荐关闭的:

#[deny(missing-debug-implementations,
       missing-docs,
       trivial-casts,
       trivial-numeric-casts,
       unused-extern-crates,
       unused-import-braces,
       unused-qualifications,
       unused-results)]

有时可能需要增加missing-copy-implementations到清单中。

请注意,我们没有关闭deprecated提示,因为可以肯定的是,将来会有更多不推荐的API。

参阅

  • deprecate attribute documentation
  • Type rustc -W help for a list of lints on your system. Also type rustc --help for a general list of options
  • rust-clippy is a collection of lints for better Rust code