#![deny(warnings)]

说明

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

示例

  1. #![deny(warnings)]
  2. // 一切安好

优点

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

缺点

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

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

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

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

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

替代方案

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

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

RUSTFLAGS="-D warnings" cargo build

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

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

  1. #[deny(bad-style,
  2. const-err,
  3. dead-code,
  4. improper-ctypes,
  5. non-shorthand-field-patterns,
  6. no-mangle-generic-items,
  7. overflowing-literals,
  8. path-statements ,
  9. patterns-in-fns-without-body,
  10. private-in-public,
  11. unconditional-recursion,
  12. unused,
  13. unused-allocation,
  14. unused-comparisons,
  15. unused-parens,
  16. while-true)]

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

  1. #[deny(missing-debug-implementations,
  2. missing-docs,
  3. trivial-casts,
  4. trivial-numeric-casts,
  5. unused-extern-crates,
  6. unused-import-braces,
  7. unused-qualifications,
  8. 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