Macros allow programmers to define single instructions that represent a block of code. A macro processor performs macro expansion by replacing macro calls with the corresponding sequence of instructions defined in the macro. Key features of macro facilities include the ability to define macros with arguments and perform conditional macro expansion. A two-pass macro processor first recognizes and saves macro definitions, then identifies macro calls and performs argument substitution and expansion.