rust 条件编译:#[cfg(foo)] vs #[cfg(feature =“foo”)]

icomxhvb  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(170)

AFAIK,#[cfg(foo)]可以使用rustc --cfg foo.cargo/config.toml中的rustflags = "--cfg foo"激活
#[cfg(feature="foo")]通过cargo build -F foo启用
两者似乎都实现了条件编译,但哪一种是正确的方法?

envsm3lx

envsm3lx1#

您很可能希望使用特性。它们可以在每个板条箱的基础上打开和关闭。这也意味着依赖项可以使用特性禁用代码中他们不需要的部分,这就是许多特性的工作方式。
以axum为例,它在cookies功能后面隐藏了类似Cookie的东西,因为不是每个使用axum的项目都希望或需要使用Cookie。
另一方面,如果您想启用或禁用整个工作区(或项目)的代码,并且不打算在每个机箱的基础上禁用这些代码,则--cfg rustflag更有用。我最常看到的是那些拥有自定义构建系统的项目使用这些标志(例如AeroOS,它使用--cfg标志来启用或禁用5级分页)。
另见@Masklinn评论

相关问题