在“macro_rules!”的字符串文字中插入“ident”

Bal*_*Ben 6 rust rust-macros

是否可以将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 =,而不仅仅是一个编译时字符串。

Joe*_*gyu 0

由于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)

操场