A macro is defined with the @MACRO @MACRO statement:
@MACRO name[arg .arg ....] = macro-definition
The square brackets here are real square brackets, not optional syntax markers. However, the square brackets with parameter names are optional (i.e., a macro can be defined with 0 arguments). Parameter names are separated by periods instead of commas. When a macro is invoked, the value supplied for each argument x is substituted into macro-definition wherever <x> appears.
A macro can be invoked with zero arguments by simply using the macro name. Arguments are passed to the macro within square brackets, separated by peridods. Multiple macros can be invoked by separating the calls with a vertical bar (|).
Macros can only be used when the xctocc syntax specifically looks for a macro call. This includes value bundling and unbunding and glue function code inserts. A macro call should produce C++ code which is passed on directly to the output C++ file.
When the result of a macro expansion begins with ``$$'', then the ``$$'' is removed and the expansion result is itself treated as a macro call.