#proc-macro #pub #extern #conditional #async #cfg-attr

qualifier_attr

为各种项目添加“修饰符”(pub、async、unsafe、const、extern "C"、...)的过程宏属性

10个版本

0.2.2 2023年8月13日
0.2.1 2023年8月13日
0.1.6 2023年4月4日
0.1.2 2023年3月29日

254Rust模式

Download history 31716/week @ 2024-04-12 29834/week @ 2024-04-19 26381/week @ 2024-04-26 25641/week @ 2024-05-03 24303/week @ 2024-05-10 21191/week @ 2024-05-17 21430/week @ 2024-05-24 27320/week @ 2024-05-31 27135/week @ 2024-06-07 26269/week @ 2024-06-14 25715/week @ 2024-06-21 24216/week @ 2024-06-28 23789/week @ 2024-07-05 22601/week @ 2024-07-12 26103/week @ 2024-07-19 24042/week @ 2024-07-26

每月下载量 99,498
735 个crate中(12个直接) 使用

MIT/Apache

54KB
1.5K SLoC

qualifier_attr

Latest Version Downloads Documentation License Dependency Status

为各种项目添加“修饰符”的过程宏属性。

目前,该crate支持以下“修饰符”

  • pubpub(crate)等. - 可见性和限制
  • default - 默认实现(专业化 的功能)
  • async - 异步代码,例如 async fn
  • unsafe - 不安全代码,例如 unsafe fnunsafe trait
  • const - 可在编译时运行的代码,例如 const fn
  • extern "ABI" - 指定ABI,例如 extern "C" fn

限制

  • 似乎当属性与模块一起使用时,rust-analyzer有时会抱怨。

示例

#[macro_use]
extern crate qualifier_attr;

// We can add a qualifier to a function
// with an attribute.
#[qualifiers(const)]
fn const_fn() -> u32 {
    42
}

const CONST_RES: u32 = const_fn();

// It's not so impressive on its own,
// but with `cfg_attr`, it can be conditional.
#[cfg_attr(feature = "extern_c", no_mangle, qualifiers(pub, extern "C"))]
fn extern_c_fn() -> u32 {
    42
}

// It even works with types, imports, and more!
mod foo {
    #[qualifiers(pub)]
    struct Foo {
        x: i32,
        y: i32,
    }
}

#[qualifiers(pub)]
use foo::Foo;

// Traits and implementations too!?
#[cfg_attr(feature = "unsafe_quux", qualifiers(unsafe))]
trait Quux {
    fn quux_the_thing();
}

#[cfg_attr(feature = "unsafe_quux", qualifiers(unsafe))]
impl Quux for Foo {
    fn quux_the_thing() {
        println!("The thing was quuxed.");
    }
}

// You can add qualifiers to the fields of a
// struct as well with this special attribute.
#[field_qualifiers(x(pub), y(pub))]
struct Point2 {
    x: i32,
    y: i32,
}

#[field_qualifiers(_0(pub), _1(pub), _2(pub))]
struct Point3(i32, i32, i32);

在此了解更多关于 cfg_attr 的信息。

关于旧属性的通知

在版本0.2.0之前,该crate为每种类型的项提供了一个单独的属性。虽然这通常会对编译时间产生小小的提升,但它通常不能由额外的复杂性来证明。旧属性仍然可以通过默认的 legacy_attrs 功能标志使用,但当前不鼓励使用。要禁用旧属性,请将以下内容添加到您的 Cargo.toml

[dependencies]
qualifier_attr = { version = "0.2", default-features = false }

类似的crate

许可证

根据您的选择,本软件受以下任一许可证的许可:Apache License, Version 2.0MIT 许可证
除非您明确表示否则,根据 Apache-2.0 许可证定义,您有意提交的任何贡献,包括在本软件包中,应双重许可如上所述,且不附加任何额外条款或条件。

依赖项

约280–730KB
约17K SLoC