Rust中的宏和函数有什么区别?

gec*_*kob 5 rust

引自Rust博客:

最后要提一句:Rust的宏与C宏有很大不同,如果你已经使用过它们了

Rust中的宏和函数有什么区别?它与C有什么不同?

She*_*ter 13

继续阅读文档,特别是有关宏的章节!

对我来说,最大的区别是宏是卫生的.这本书有一个例子说明卫生防止了什么,并且还说:

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

它使用这个例子:

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

#define FIVE_TIMES(x) 5 * x

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

除此之外,Rust宏

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

  • 我不明白为什么它是“5 * 2 + 3”而不是“5 * 5”。值得一提的是,大多数人可能不会阅读“FIVE_TIMES(x)”会将“x”作为运算“2 + 3”的链接,**不是**“2+3 = 5”的结果。代入 2 + 3,则得到“5 * 2 + 3”,按照运算顺序,得到“5*2 = 10”,然后得到“10 + 3 = 13”。因此,如果您从字符串角度思考,这只是一个未评估的替换。 (17认同)
  • 这个答案缺少回答“宏和函数之间有什么区别?”的一件事。是“为什么我们需要函数?”,因为答案似乎将宏描述为具有函数的所有功能甚至更多。 (10认同)

小智 9

引用Rust 文档

宏和函数的区别

从根本上说,宏是一种编写代码的方式,可以编写其他代码,这被称为元编程。在附录 C 中,我们讨论了derive 属性,它为您生成各种特征的实现。我们还在整本书中使用了println!vec!宏。所有这些宏都会扩展以生成比您手动编写的代码更多的代码。

元编程有助于减少您必须编写和维护的代码量,这也是函数的作用之一。但是,宏具有函数所没有的一些附加功能。

函数签名必须声明函数具有的参数数量和类型。另一方面,宏可以接受可变数量的参数:我们可以println!("hello")用一个参数或 println!("hello {}", name)两个参数调用。此外,宏在编译器解释代码的含义之前被扩展,因此宏可以,例如,在给定类型上实现特征。函数不能,因为它在运行时被调用,并且需要在编译时实现特征。

实现宏而不是函数的缺点是宏定义比函数定义更复杂,因为您编写的 Rust 代码会编写 Rust 代码。由于这种间接性,宏定义通常比函数定义更难阅读、理解和维护。

宏和函数之间的另一个重要区别是,在文件中调用宏之前,必须先定义宏或将它们引入作用域,而不是可以在任何地方定义并在任何地方调用的函数。

  • 好的。但为什么???? (3认同)