&gt; #ifdefs don&#x27;t protect you from misspelled words, #ifs do.<p>That&#x27;s not (typically) correct. If an undefined identifier is used in a preprocessor expression, it expands (contracts?) to a constant 0. gcc does not warn about using undefined identifiers by default, and if there&#x27;s an option to make it do so I&#x27;m not familiar with it. (<i>EDIT: I am now, it&#x27;s &quot;-Wundef&quot;. Thanks, sigjuice.</i>) For example, this program:<p><pre><code>    #include &lt;stdio.h&gt;
    
    #define MISPELLED
    
    int main(void) {
    #if MISPELED
        puts(&quot;MISPELED is true&quot;);
    #else
        puts(&quot;MISPELED is false&quot;);
    #endif
    
    #ifdef MISPELED
        puts(&quot;MISPELED is defined&quot;);
    #else
        puts(&quot;MISPELED is not defined&quot;);
    #endif
    }
</code></pre>
produces no compile-time diagnostics and prints this output:<p><pre><code>    MISPELED is false
    MISPELED is not defined
</code></pre>
If you have a C compiler that warns about this, that&#x27;s great -- but you&#x27;re likely to get spurious warnings for some code.