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

时间:2015-04-25 23:40:06

标签: rust

引自Rust blog

  

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

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

3 个答案:

答案 0 :(得分:13)

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

对我来说,最大的不同是macros are hygenic。这本书有一个例子可以解释卫生方面的阻碍,并说:

  

每个宏扩展都发生在不同的“语法上下文”中,每个变量都用引入它的语法上下文标记。

它使用了这个例子:

  

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

#define FIVE_TIMES(x) 5 * x

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

除此之外,Rust宏

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

答案 1 :(得分:0)

引用the Rust documentation

宏与函数之间的区别

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

元编程对于减少必须编写的代码量和 维护,这也是功能的作用之一。但是,宏具有 一些其他功能无法发挥作用。

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

实现宏而不是函数的缺点是该宏 定义比函数定义更复杂,因为您正在编写 编写Rust代码的Rust代码。由于这种间接方式,宏定义为 通常比功能更难以阅读,理解和维护 定义。

宏和函数之间的另一个重要区别是您必须 定义宏或将它们带入范围之前在文件中调用它们,如下 与您可以在任何地方定义并在任何地方调用的函数相对。

答案 2 :(得分:-1)

macro中,您可以采用可变数量的参数。

function中,您必须定义参数的数量和类型。