是否可以将macro_rules!类型的变量插入ident宏中的字符串文字中?换句话说,是否可以“转义”文字的双引号?
// `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;
Run Code Online (Sandbox Code Playgroud)
我尝试过使用#[cfg(target_os = stringify!($system))],但cfg需要一个实际的字符串文字target_os =,而不仅仅是一个编译时字符串。
由于cfg属性需要 aliteral并且pub mod需要 a ident,我认为您可以使用两个值作为宏的输入,并将一个值作为元literal变量进行匹配,另一个作为元ident变量进行匹配。当功能和模块的名称不同时,这会更灵活。
#![feature(trace_macros)]
trace_macros!(true);
macro_rules! export_mod_if_feature {
($system:literal, $module:ident) => {
#[cfg(target_os = $system)]
pub mod $module;
};
}
export_mod_if_feature!("linux", linux);
Run Code Online (Sandbox Code Playgroud)