#rustc #compiler-version #rustc-version #conditional-compilation #nightly #stable #beta

已撤销 select-rustc

根据rustc编译器版本进行条件编译

0.1.2 2019年5月7日
0.1.1 2019年5月3日
0.1.0 2019年4月29日

#19 in #rustc-version

每月 22 次下载

MIT/Apache

30KB
623

编译器版本 cfg

Build Status Latest Version Rust Documentation

此crate提供宏,用于根据rustc编译器版本进行条件编译,类似于#[cfg(...)]#[cfg_attr(...)].

[dependencies]
select-rustc = "0.1"

选择器

  • #[rustc::stable]
    在任何稳定编译器上为真。

  • #[rustc::stable(1.34)]
    在指定的稳定编译器上为真。

  • #[rustc::beta]
    在任何beta编译器上为真。

  • #[rustc::nightly]
    在任何nightly编译器或开发构建上为真。

  • #[rustc::nightly(2019-01-01)]
    仅在特定的nightly版本上为真。

  • #[rustc::since(1.34)]
    在相应的稳定版本和任何后续的编译器(包括beta和nightly)上为真。

  • #[rustc::since(2019-01-01)]
    在相应的nightly版本及其所有后续版本上为真。

  • #[rustc::before(版本或日期)]
    #[rustc::since(...)] 的否定。

  • #[rustc::not(选择器)]
    任何选择器的否定;例如 #[rustc::not(nightly)]

  • #[rustc::any(选择器...)]
    如果任何用逗号分隔的选择器为真,则为真;例如 #[rustc::any(stable, beta)]

  • #[rustc::all(选择器...)]
    如果所有用逗号分隔的选择器都为真,则为真;例如 #[rustc::all(since(1.31), before(1.34))]

  • #[rustc::attr(选择器, 属性)]
    用于条件性地包含属性;类似于 cfg_attr


用例

当类型作为标准库中的稳定实现提供额外的特质实现时,不破坏与较老编译器的兼容性;例如,在 Rust 1.33 中稳定的 Pin<P>

#[rustc::since(1.33)]
use std::pin::Pin;

#[rustc::since(1.33)]
impl<P: MyTrait> MyTrait for Pin<P> {
    /* ... */
}

类似,但对于语言特性;控制打包结构体大于1的对齐能力在 Rust 1.33 中稳定。

#[rustc::attr(before(1.33), repr(packed))]
#[rustc::attr(since(1.33), repr(packed(2)))]
struct Six(i16, i32);

fn main() {
    println!("{}", std::mem::align_of::<Six>());
}

当const实现作为标准库中的稳定实现时,通过 const 增强代码。这种将 const 作为属性的使用,被 rustc::attr 宏识别为特殊情况。

use std::time::Duration;

#[rustc::attr(since(1.32), const)]
fn duration_as_days(dur: Duration) -> u64 {
    dur.as_secs() / 60 / 60 / 24
}

许可

根据您的选择,在 Apache License, Version 2.0MIT 许可证 下许可。
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交包含在此包中的任何贡献,都将采用上述双重许可方式,不附加任何额外条款或条件。

依赖关系

约2MB
约46K SLoC