Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

宏函数的定义

基本语法

宏用 macro fun 定义。宏的类型参数名值参数名必须以 $ 开头,以便与普通函数区分:

module example::def;

macro fun add_three($x: u64, $y: u64, $z: u64): u64 {
    $x + $y + $z
}

public fun demo(): u64 {
    add_three!(1, 2, 3)
}
  • 调用必须使用 name!(...)(带 !),与普通调用的 name(...) 区分。
  • 宏可以有 publicpublic(package)friend 等可见性,规则与普通函数类似(依项目布局而定)。

$ 参数的含义

$ 开头的参数在宏体中按表达式/类型片段参与展开,而不是「先求值成一个值再传入」。具体语义见 §11.4 展开与求值

fun 的对比(定义侧)

funmacro fun
参数前缀普通标识符类型/值参数需 $(Move 2024 约定)
调用语法f(a, b)f!(a, b)
Lambda 形参无(Move 无独立函数类型作为值)可有 lambda 形参(仅宏)

小结

记住三样:macro fun$ 参数! 调用。下一节专门讲「展开」时到底发生了什么。