繁体   English   中英

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

[英]What is the difference between macros and functions in Rust?

引自Rust 博客

最后要提到的一件事:Rust 的宏与 C 宏有很大的不同,如果你使用过那些

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

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

Rust 函数与 Rust 宏

宏在编译时执行。 它们通常会扩展为编译器需要进一步处理的新代码段。

Rust 宏与 C 宏

对我来说最大的不同是Rust 宏是卫生的 这本书有一个例子解释了卫生可以预防什么,并且还说:

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

它使用这个例子:

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

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

除此之外,Rust 宏

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

引用Rust 文档

宏和函数的区别

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM