cfg 宏允许根据条件来决定是否包含某一段代码,使得代码能够根据环境变量、目标平台等进行适应性配置。使用concat和stringify宏 concat! 宏用于将多个字符串文字连接在一起,而 stringify! 宏则用于将传入的代码片段转换为字符串。macro_rules! my_macro { () => { println!("This is my macro!");};} fn mai...
#[derive],在阅读代码过程中经常见到,可以为目标结构体或枚举派生指定的代码,例如 Debug 特征 类属性宏(Attribute-like macro),用于为目标添加自定义的属性 类函数宏(Function-like macro),看上去就像是函数调用。 Rust宏相比于C的宏,在类型安全性、模式匹配、卫生性(见下面注释)、定义与使用上都有大幅提升;自然...
宏、为数据结构添加各种 trait 支持的 #[derive(Debug, Default, ...)]、条件编译时使用的 #[cfg(test)] 宏等等。 其实Rust 中的宏就两大类:对代码模板做简单替换的声明宏(declarative macro)、可以深度定制和生成代码的过程宏(procedural macro)。 声明宏 首先是声明宏(declarative macro),像 vec![]、println!
[1,2,3]// MacroInvocationcontinue'hello// ContinueExpressionbreak'hello// BreakExpressionreturn42// ReturnExpression{}// BlockExpression#[cfg("hello")]{}unsafe{}// UnsafeExpressionifcondition {}// IfExpressionifleta=b {}// IfLetExpressionmatchx {}// MatchExpression} ty 一个类型 Type macro_...
CfgAttr:表示条件编译相关的属性,用于限制代码在某些条件下的编译和执行。 DocComment:表示文档注释属性,用于生成Rust代码的文档。 RemappedAttr:表示通过macro_rules!宏重映射生成的属性。 ErrorAttr:表示解析错误的属性。 ValueAttr:表示具有某种特定值的属性,它包含了属性的值和相应的类型。 通过这些ResolvedAttr枚举的...
自定义属性 可以说自定义派生属性是自定义属性的特例。例如条件编译属性#[cfg()]和测试属性#[test]都是自定义属性。 test.rs usemy_proc_macro::attr_with_args;#[attr_with_args("Hello, Rust!")]fnfoo(){}#[test]fntest_foo(){assert_eq!(foo...
在Rust中,属性宏是一种特殊的宏,它允许开发者在代码上方添加自定义的属性,并在编译期间对代码进行处理。属性宏使用proc_macro_attribute属性来定义,其基本形式如下: extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro_attribute] pub fn attribute_macro(attr: TokenStream, item: TokenStream) ...
2. 和 C 的宏不一样的地方: 它是健康宏, 语法上带 bang 容易区分, 可以做循环 3. Rust 宏可以...
cfg和cfg_attr属性是 active 的。 当编译为 test 模式时,test属性是 insert 的。编译为非 test 模式时,test属性是 active 的。 属性宏是 active 的。 所有其它属性是 insert 的。 属性的分类 Rust 中的属性,可以分为以下四大类。 Macro attributes - 宏属性 ...
use proc_macro::TokenStream;#[proc_macro_attribute]pub fnmy_feature(_attr:TokenStream,item:TokenStream)->TokenStream{letmut result=item.to_string();#[cfg(feature="my_feature")]result.push_str("fn my_function() { println!(\"my_feature is enabled!\"); }");result.parse().unwrap()}#[...