如何在宏中添加前缀/后缀标识符?

时间:2016-08-18 12:09:46

标签: macros rust

使用定义函数的宏时,是否可以在函数中添加前缀?

macro_rules! my_test {
    ($id:ident, $arg:expr) => {
        #[test]
        fn $id() {
            my_test_impl(stringify!($id), $arg);
        }
    }
}

例如,fn my_test_$id() {

我使用可能以数字开头的标识符定义测试,我想使用公共前缀。

3 个答案:

答案 0 :(得分:6)

  

[...]是否可以在函数中添加前缀?

没有。真的,真的没有。 Super 完全没有,即使是最轻微的。

  

我想使用通用前缀。

将它们全部放在mod中。

答案 1 :(得分:1)

目前稳定版不支持此功能。

但夜间有一项名为concat_idents的功能:

concat_idents!(my_test_, $id)

更新:似乎没有近期计划将其添加到稳定版本中,请参阅问题。

答案 2 :(得分:1)

如上所述,您应该使用子模块,但请记住,宏可以创建子模块,子模块可以嵌套,允许它们的名称重叠,子模块可以提供impltests子模块是不是魔法。

我曾经提交了一个pull request,通过使用这些技巧重构代码来避免许多“锅炉名称”,尽管#[no_mangle]导出使其变得更难。