举个例子:
static COUNT: AtomicUsize = AtomicUsize::new(0);
#[proc_macro_attribute]
pub fn count_usages(_attr: TokenStream, item: TokenStream) -> TokenStream {
let c = COUNT.fetch_add(1, Ordering::AcqRel);
println!("Do stuff with c: {}", c);
item
}
尽管处理的订单属性可能不同,但每次的最终计数是否相同,例如:
- 增量建筑
- Registry crates 和本地 crates 共享相同的 proc_macro 库和版本
- 编译器内部并行
一个实际用例(尤其是我的)是生成编译时伪静态变量内存布局,该布局将在静态链接的可执行文件中的多个内存管理器中重用。