是否可以将ident
类型的macro_rules!
变量插入到宏中的字符串文字中?换句话说,是否可以“转义”文字的双引号?
// `trace_macros!` requires nightly
#![feature(trace_macros)]
trace_macros!(true);
macro_rules! export_mod_if_feature {
($system:ident) => {
#[cfg(target_os = "$system")] // <-- problem is here
pub mod $system;
};
}
export_mod_if_feature!(linux);
// ... should translate to:
#[cfg(target_os = "linux")]
pub mod linux;
// ... but instead it becomes:
#[cfg(target_os = "$system")]
pub mod linux;
字符串
我试过使用#[cfg(target_os = stringify!($system))]
,但是cfg
需要在target_os =
之后有一个实际的字符串,而不仅仅是一个编译时字符串。
2条答案
按热度按时间hs1ihplo1#
由于
cfg
属性需要一个literal
,而pub mod
需要一个ident
,所以我认为可以使用两个值作为宏的输入,并将一个作为literal
元变量,另一个作为ident
元变量进行匹配。当功能和模块的名称不同时,这将更加灵活。字符串
Playground
8yoxcaq72#
是的,
stringify!(...)
宏可以做到这一点,this thread也是如此。