引自《Rust blog人报》:

最后要提到的一点是:Rust的宏与C宏有很大的不同,如果你使用过的话

宏和函数的区别是什么?它和C有什么不同?

推荐答案

继续阅读文档,特别是the chapter on macros

Rust functions vs Rust macros

宏在编译时执行.它们通常会扩展成新的代码段,然后编译器需要进一步处理这些代码段.

Rust macros vs C macros

对我来说最大的区别是Rust macros are hygenic.这本书有一个例子,解释了什么是卫生预防,还说:

每个宏扩展都发生在一个不同的"语法上下文"中,每个变量都用引入它的语法上下文进行标记.

它使用了以下示例:

例如,这个C程序打印13而不是预期的25.

#define FIVE_TIMES(x) 5 * x

int main() {
    printf("%d\n", FIVE_TIMES(2 + 3));
    return 0;
}

除此之外,Rust 的宏

  • 可以与编译后的代码一起分发
  • 可以在参数计数中重载
  • 可以匹配大括号、括号或逗号等语法模式
  • 可能需要重复输入模式
  • 可以是递归的
  • 在语法层面上操作,而不是文本层面

Rust相关问答推荐

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

关联类型(类型参数)命名约定

如何使用syn插入 comments ?

新创建的变量的绑定生存期

在Rust中是否可以使用Rc自动化约束传播

通过RabbitMQ取消铁 rust 中长时间运行的人造丝任务的策略

在运行特定测试时,如何 suppress cargo test 的空输出?

使用 Option 来分配?

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

将 &str 或 String 保存在变量中

max(ctz(x), ctz(y)) 有更快的算法吗?

分配给下划线模式时会发生什么?

如何限制通用 const 参数中允许的值?

仅在运行测试时生成调试输出

返回引用字符串的future

在单独的线程上运行 actix web 服务器

为什么我可以从读取的可变自引用中移出?

有没有办法使用 NASM 语法进行内联汇编?

令人困惑的错误消息? (解包运算符)

为什么在使用 self 时会消耗 struct 而在解构时不会?