有没有办法强制正确拼写特征?

Is there a way to enforce correct spelling of features?

假设我在 Cargo.toml 中定义了以下功能:

[features]
my_feature = []

下面的代码存在于 src/lib.rs 中:

#[cfg(feature = "my_feature")]
fn f() { /* ... */ }

#[cfg(not(feature = "my_faeture"))] // <-- Mind the typo!
fn f() { /* ... */ }

我如何强制特征字符串与 Cargo.toml 中显式定义和隐式可用特征的列表相匹配,以便避免拼写错误?

RFC 3013, "Checking conditional compilation at compile time", is implemented, there will be warnings for a #[cfg] referring to a feature name that is not declared by Cargo, just as you're asking for. However, the implementation only just got started(2021 年 9 月 28 日)时。

RFC 中描述的操作方式正如您所建议的那样,“cargo 会将标志传递给 rustc”。


可能值得注意的是,这不会检查源文本中出现的 所有 个条件;如所述 in the RFC:

This lint will not be able to detect invalid #[cfg] tests that are within modules that are not compiled, presumably because an ancestor mod is disabled.

因此,它不会确认所有 #[cfg(feature)] 在单个 cargo check 上都有效 — 您将需要使用各种功能或功能组合进行测试。但是这些组合是您无论如何都需要检查所有可以启用的常规源代码中的编译错误的组合;一旦你这样做了,lint 将向你保证你没有任何 #[cfg(feature)] 由于打字错误 从未 启用。