Skip to main content

C++ Preprocessor Directives

C++ preprocessor visualized: macros, header guards, conditional compilation, and #include directives explained interactively.

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.

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