内容提要
Rust 1.80将自动检查#[cfg]是否与预期的配置名称和值匹配,以帮助验证crate是否正确处理不同目标平台或功能的条件编译。这有助于捕捉开发过程中的潜在错误。Cargo还提供了新的指令cargo::rustc-check-cfg,用于检查自定义cfg。该功能无法禁用,但可以通过控制lints来控制。
延伸解读
自动检查机制如何工作
从 Rust 1.80 开始,编译器会自动检查代码中所有可达的 #[cfg] 条件,确保其配置名称和值与预期一致。Cargo 会将声明的特性转换为配置传递给 rustc,并与已知配置对比。如果发现未预期的配置,会通过 unexpected_cfgs lint 报告警告。这有助于在开发早期发现条件编译错误,例如拼写错误或未声明的特性。
自定义 cfg 的处理方式
自定义 cfg 是指既不由 rustc 定义也不由 Cargo 特性定义的配置,例如 tokio_unstable。对于这类配置,Cargo 1.80 引入了 cargo::rustc-check-cfg 指令,需要在 build.rs 中声明以表明预期。每个 cargo::rustc-cfg 都应伴随一个无条件的 cargo::rustc-check-cfg,否则会触发警告。目前没有其他方法可以在没有 build.rs 的情况下预期自定义 cfg,因此鼓励使用 Cargo 特性替代。
lint 的控制与影响范围
unexpected_cfgs lint 无法禁用,但可以通过 lint 属性进行控制,例如 #![warn(unexpected_cfgs)]。该 lint 仅对本地包报告,不会影响依赖项,这得益于 cap-lints 机制。RUSTFLAGS 环境变量的使用方式不变,但 --cfg 参数本身不会被检查,只有代码中的使用会被检查。这意味着通过 RUSTFLAGS 传递的自定义 cfg 不会直接触发警告,除非在本地代码中使用。
Q&A
Rust 1.80的新特性是什么?
Rust 1.80将自动检查#[cfg]是否与预期的配置名称和值匹配。
如何使用cargo::rustc-check-cfg指令?
使用cargo::rustc-check-cfg指令可以检查自定义cfg,确保它们符合预期。
这个新功能对开发者有什么帮助?
该功能帮助开发者验证crate是否正确处理条件编译,捕捉潜在错误。
如何控制unexpected_cfgs lint?
虽然该功能无法禁用,但可以通过控制lints来管理,例如使用#![warn(unexpected_cfgs)]。
自定义cfg的定义是什么?
自定义cfg是指既不由rustc定义也不由Cargo特性定义的配置。
RUSTFLAGS环境变量如何与新功能交互?
RUSTFLAGS环境变量的使用与之前相同,--cfg参数不会被检查。