【发布时间】:2021-11-30 19:45:27
【问题描述】:
假设我在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 中显式定义和隐式可用特征的列表相匹配,从而避免例如拼写错误?
【问题讨论】:
-
Clippy 应该有 lint 的东西,但显然没有。
-
我坚信这应该是
rustc的责任。例如,您可以传递一组您希望编译器强制执行的功能,而不是将这个责任进一步推给 linter,这是非常可选的。 -
rustc 对
Cargo.toml一无所知。在那里定义的一组特性(然后被选择用于编译)被简单地转换为 rustc 调用的--cfg参数:rustc 不会知道任何存在但未启用的特性,Cargo 也不会使用feature作为 rustc 特殊的任何方式的 cfg 密钥。 -
没错,这就是为什么
cargo如果能够接受功能标志进行严格检查,会将标志传递给rustc。 -
在我看来,这是构建工具的特性,而不是 rustc 本身。不同的构建工具可能使用
option作为cfg 标识符而不是feature;可能会为每个此类功能提供其自己的 cfg 标识符,每个标识符都有一个布尔值(以指示它是否已启用);或者确实可能会做一些完全不同的事情。要求编译器为每个可能的构建工具提供一个验证器似乎是不必要的复杂,还有其他任何东西都会将它与一种特定的方法耦合得太紧吗?
标签: rust macros rust-cargo conditional-compilation