The C++ Preprocessor
The preprocessor is your first line of code transformation, running before compilation begins. It handles macros, includes, and conditional compilation through simple text substitution.
Key Directives
Macros (#define)
#define PI 3.14159 #define SQUARE(x) ((x) * (x)) #define MAX(a,b) ((a) > (b) ? (a) : (b))
Include Guards
#ifndef HEADER_H #define HEADER_H // Header content #endif // Or modern: #pragma once
Conditional Compilation
#ifdef DEBUG #define LOG(x) std::cout << x #else #define LOG(x) #endif
Common Pitfalls
- Missing parentheses:
#define DOUBLE(x) x * 2→ Use((x) * 2) - Side effects:
SQUARE(i++)expands to((i++) * (i++)) - Name collisions: Macros are global, use unique names
Best Practices
- Prefer
constandconstexprover macros - Use ALL_CAPS for macro names
- Always parenthesize macro parameters
- Document macro behavior
- Consider inline functions instead
Next Steps
- Explore AST & Parsing
- Learn about Compilation Pipeline
- Master Templates for type-safe alternatives
