Rust进阶之条件编译

     Rust有一个特殊的属性,#[cfg],允许你一句传递给编译器的标志来编译代码。它有两种形式:

     #[cfg(foo)]

     #[cfg(bar = "baz")]

     它们还有一些辅助形式:

     #[cfg(any(unix, windows))]

     #[cfg(all(unix, target_pointer_width = "32"))]

     #[cfg(not(foo))]

     可以随意嵌套:

     #[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))]

     如果你正在使用Cargo,怎样打开或关闭这些开关,它们在Cargo.toml文件中的[features]节进行设置。

     [features]
     # no features by default
     default = []

     # The “secure-password” feature depends on the bcrypt package.
     secure-password = ["bcrypt"]

     当你这么做了,Cargo会给rustc传递一个参数:

     --cfg feature="${feature_name}"

     这些cfg标志将会决定哪个一个被激活,因此,哪个代码被编译。我们看一下这段代码:

     #[cfg(feature = "foo")]
     mod foo {
     }

     如果我们使用cargo build --features "foo"编译,它将会把--cfg feature="foo"标志传递给rustc,并且输出将会有一个foo模块。如果我们使用常规的cargo build,没有额外的标志被传递,将不会有foo模块存在。

cfg_attr


     你可以使用cfg_attr给基于cfg的变量设置另外一个属性:

     #[cfg_attr(a, b)]

     如果a被使用cfg设置过属性,则跟#[b]一样。

cfg!


     cfg!语法扩展允许你在代码中使用这些种类的标志:

     if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
         println!("Think Different!");
     }

     在编译阶段依据配置设定,这些将会被替换成true或false。 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值