C++ Preprocessor

5 min

Master the C++ preprocessor with interactive visualizations of macros, includes, and conditional compilation.

Best viewed on desktop for optimal interactive experience

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.

C++ Preprocessor Visualizer

Preprocessing Pipeline

??=
Trigraph Replacement
Legacy character replacement
\
Line Splicing
Join continued lines
[ ]
Tokenization
Break into tokens
#
Macro Expansion
Replace macros
<>
Include Processing
Insert header files
#if
Conditional Compilation
Process conditionals
Original Code
#define PI 3.14159
#define SQUARE(x) ((x) * (x))

float area = PI * SQUARE(radius);
After Preprocessing
float area = 3.14159 * ((radius) * (radius));

💡 Explanation: Macros are replaced with their definitions. Note the parentheses in SQUARE to ensure correct precedence.

Preprocessor Commands

g++ -E main.cpp -o main.iPreprocess only
g++ -dM -E main.cppShow all defined macros
g++ -H main.cppShow included headers

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

  1. Prefer const and constexpr over macros
  2. Use ALL_CAPS for macro names
  3. Always parenthesize macro parameters
  4. Document macro behavior
  5. Consider inline functions instead

Next Steps

If you found this explanation helpful, consider sharing it with others.

Mastodon