Macros allow code to be substituted before compilation by replacing text. During preprocessing: 1) Macros find and replace text without evaluating code. 2) Macro arguments are substituted but not evaluated. 3) Unintended side effects can occur from operations inside macros.