Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between macros and functions in Rust?

Tags:

rust

Quoted from the Rust blog:

One last thing to mention: Rust’s macros are significantly different from C macros, if you’ve used those

What is the difference between macros and function in Rust? How is it different from C?

like image 748
geckob Avatar asked Apr 25 '15 23:04

geckob


People also ask

Is it better to use function or macro?

Macros have the distinct advantage of being more efficient (and faster) than functions, because their corresponding code is inserted directly into your source code at the point where the macro is called. There is no overhead involved in using a macro like there is in placing a call to a function.

What are functions in Rust?

Functions are the building blocks of readable, maintainable, and reusable code. A function is a set of statements to perform a specific task. Functions organize the program into logical blocks of code.

Can you use macros on Rust?

The most widely used form of macros in Rust is the declarative macro. These are also sometimes referred to as “macros by example,” “ macro_rules! macros,” or just plain “macros.” At their core, declarative macros allow you to write something similar to a Rust match expression.


1 Answers

Keep on reading the documentation, specifically the chapter on macros!

Rust functions vs Rust macros

Macros are executed at compile time. They generally expand into new pieces of code that the compiler will then need to further process.

Rust macros vs C macros

The biggest difference to me is that Rust macros are hygenic. The book has an example that explains what hygiene prevents, and also says:

Each macro expansion happens in a distinct ‘syntax context’, and each variable is tagged with the syntax context where it was introduced.

It uses this example:

For example, this C program prints 13 instead of the expected 25.

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

Beyond that, Rust macros

  • Can be distributed with the compiled code
  • Can be overloaded in argument counts
  • Can match on syntax patterns like braces or parenthesis or commas
  • Can require a repeated input pattern
  • Can be recursive
  • Operate at the syntax level, not the text level
like image 75
Shepmaster Avatar answered Oct 26 '22 09:10

Shepmaster