如何从宏中的表达式参数中获取标识符?

我有一个由变量定义的常量值:

const VAL: usize = 32;

我想做一个这样的函数:

macro_rules! valfn {
    ($val:expr) => {
        pub fn $val () -> () {   // here val needs to be a ident
            some_other_fn($val)  // here it needs to be a expr
        }
    };
}

valfn!(VAL);

如果我可以以一种或另一种方式对 ident 值进行一些操作以避免定义冲突,则奖励积分。我可以使用函数定义来隐藏变量吗?应该不会...

const VAL: usize = 32;
valfn!(VAL); // creates: fn VAL()

const VAL_: usize = 32;
valfn!(VAL_); // creates: fn VAL()
zxtong961 回答:如何从宏中的表达式参数中获取标识符?

接受一个令牌树,然后将其解释两次,一次作为 ident,一次作为 expr

macro_rules! valfn {
    ($val:tt) => { valfn!(@ $val,$val); };
    (@ $vali:ident,$vale:expr) => {};
}

为避免名称冲突,请使用下面链接的许多提到的解决方案之一。一个例子是粘贴箱:

use paste::paste; // 1.0.4

fn some_other_fn(_: usize) {}

const VAL: usize = 32;

macro_rules! valfn {
    ($val:tt) => { valfn!(@ $val,$vale:expr) => {
        paste! {
            pub fn [<$vali:lower _fn>]() {
                some_other_fn($vale);
            }
        }
    };
}

valfn!(VAL);

fn main() {
    val_fn();
}

另见:

,

在宏中,ident 是有效的 expr,因此您可以使用 ident

macro_rules! valfn {
    ($val: ident => {
        pub fn $val () -> () {
            some_other_fn($val)
        }
    };
}

您可以添加模块以避免命名冲突,或 Shepmaster 回答中的任何其他建议。

本文链接:https://www.f2er.com/1182593.html

大家都在问