This resource is a draft.

We're currently in the process of finishing this resource. Check back frequently as we continue to add more content and improve our typos.

Preprocessor macros are powerful tools that give direct instructions to a compiler. They can be very useful when debugging your code.

Caution

Preprocessor macros ignore the structure of your code, and so can be dangerous if handled badly. If you aren’t experienced with them, it’s best to work only with macros that affect small segments of code.

This article is a compilation of a number of common macros and applications of them you may want to consider.

#include

Includes a header file. You already use this when including specific libraries from the standard library.

Replacement token #define

Once #define [TOKEN] [REPLACEMENT] has been invoked, all instances of TOKEN that appear afterword will be replaced with REPLACEMENT. This can be undone with #undef [TOKEN].

These are commonly used for magic numbers or readability:

<span id="L1" class="line"><span class="cp">#define PI 3.14159265358979</span></span>
<span id="L2" class="line"><span class="cp">#define p3i std::pair&lt;int, std::pair&lt;int, int&gt; &gt;</span></span>
<span id="L3" class="line"><span class="cp">#define mpii std::make_pair</span></span>
<span id="L4" class="line"></span>
<span id="L5" class="line"><span class="c1">//...</span></span>
<span id="L6" class="line"></span>
<span id="L7" class="line">    <span class="n">p3i</span> <span class="n">p</span> <span class="o">=</span> <span class="n">mpii</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">mpii</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span><span class="n">PI</span><span class="o">*</span><span class="mi">100</span><span class="p">)));</span></span>

The above line is equivalent to:

<span id="L1" class="line">    <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">p</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span><span class="mf">3.14159265358</span><span class="o">*</span><span class="mi">100</span><span class="p">)));</span></span>

Function macro #define

#define macros can be used to make what are similar to functions, and are also usually used for readability. They can also be undone with #undef.

<span id="L1" class="line"><span class="cp">#define scan(x) scanf("%d",&amp;(x));</span></span>
<span id="L2" class="line"></span>
<span id="L3" class="line"><span class="c1">//...</span></span>
<span id="L4" class="line"></span>
<span id="L5" class="line">    <span class="n">scan</span><span class="p">(</span><span class="n">n</span><span class="p">);</span></span>
<span id="L6" class="line">    <span class="n">scan</span><span class="p">(</span><span class="n">m</span><span class="p">);</span></span>

... is equivalent to:

<span id="L1" class="line">    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">n</span><span class="p">));</span></span>
<span id="L2" class="line">    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">m</span><span class="p">));</span></span>

Always surround arguments of a macro function with brackets and never put in an expression with side effects.

<span id="L1" class="line"><span class="cp">#define dist(x,y) sqrt(x*x+y*y)</span></span>
<span id="L2" class="line">    <span class="k">return</span> <span class="n">dist</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="p">,</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="p">);</span></span>

... is equivalent to…​

<span id="L1" class="line">    <span class="k">return</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="o">*</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="o">+</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="o">*</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="p">);</span></span>

... when you really wanted…​

<span id="L1" class="line"><span class="cp">#define dist(x,y) sqrt((x)*(x)+(y)*(y))</span></span>
<span id="L2" class="line">    <span class="k">return</span> <span class="n">dist</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="p">,</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="p">);</span></span>

... which is equivalent to…​

<span id="L1" class="line">    <span class="k">return</span> <span class="n">sqrt</span><span class="p">((</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="n">x2</span><span class="p">)</span><span class="o">+</span><span class="p">(</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">y1</span><span class="o">-</span><span class="n">y2</span><span class="p">));</span></span>

Token definitions and #ifdef blocks

This is most useful when you want to toggle sections of code at will, such as when you’re switching between debug output to real output.

<span id="L1" class="line"><span class="cp">#define DEBUG</span></span>
<span id="L2" class="line"></span>
<span id="L3" class="line"><span class="cp">#ifdef DEBUG</span></span>
<span id="L4" class="line">    <span class="n">printf</span><span class="p">(</span><span class="s">"%4d %4d %4d:%04d -&gt; %d"</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">arr</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">res</span><span class="p">);</span></span>
<span id="L5" class="line"><span class="cp">#endif</span></span>

Commenting out the first line, #define DEBUG, will prevent the printf line from being compiled.