macros - 订购宏参数执行

标签 macros rust

我正在使用一个字符串驻留库 ( string-cache ),它使用宏来高效地创建元素 (atom!)。然而,为了简化,这里有一个类似的宏来演示问题

macro_rules! string_intern {
   ("d") => ("Found D");
}

假设我需要从另一个宏调用这个宏并给它一个标识符的字符串版本。

macro_rules! print_ident {
    ($id:ident) => (
        string_intern!(stringify!($id));
    );
}

但是调用这个宏

fn main() {
    print_ident!(d);
}

因错误而失败:

error: no rules expected the token `stringify`
 --> <anon>:7:24
  |
7 |         string_intern!(stringify!($id));
  |                        ^^^^^^^^^

Playground link

我知道 stringify! 正确地将标识符 d 转换为字符串 "d",因为将它提供给 println! 按预期工作。有没有办法将我想要转换成字符串的标识符传递给 string_intern

最佳答案

println! 允许您执行此操作,因为它使用 format_args!在幕后,这是一个编译器提供的“内在”,在使用它之前强行评估它的第一个参数。您不能从用户定义的宏中执行此操作;你必须编写一个编译器插件(这需要一个夜间编译器并且不能保证稳定性)。

所以,是的;你不能。对不起。您唯一可以做的就是以您不需要实际字符串文字的方式重新定义宏,或者更改调用它的方式。

关于macros - 订购宏参数执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816895/

相关文章:

c - 如何在预处理器宏中对算术结果进行字符串化

c++ - 宏增加值然后连接

rust - 对于在Rust中没有有意义的值的 map ,什么是内存有效类型?

hashmap - 为什么 HashMap 需要加密安全的哈希函数?

具有 2 个参数问题的 C 预处理器宏

macros - 如何用模板宏重写这个宏?

javascript - 我如何获取从wasm(rust)到js的静态mut的地址?

syntax - { .. } 在模式中意味着什么?

rust - 无法调用返回结果的函数:找到不透明类型 impl std::future::Future

c - 宏内不正确的未初始化变量警告