 <p>It's identical to commenting out the block, except with one important difference: Nesting is not a problem. Consider this code:</p> <pre><code>foo(); bar(x, y); /* x must not be NULL */ baz(); </code></pre> <p>If I want to comment it out, I might try:</p> <pre><code>/* foo(); bar(x, y); /* x must not be NULL */ baz(); */ </code></pre> <p>Bzzt. Syntax error! Why? Because block comments do not nest, and so (as you can see from SO's syntax highlighting) the <code>*/</code> after the word "NULL" terminates the comment, making the <code>baz</code> call not commented out, and the <code>*/</code> after <code>baz</code> a syntax error. On the other hand:</p> <pre><code>#if 0 foo(); bar(x, y); /* x must not be NULL */ baz(); #endif </code></pre> <p>Works to comment out the entire thing. And the <code>#if 0</code>s will nest with each other, like so:</p> <pre><code>#if 0 pre_foo(); #if 0 foo(); bar(x, y); /* x must not be NULL */ baz(); #endif quux(); #endif </code></pre> <p>Although of course this can get a bit confusing and become a maintenance headache if not commented properly.</p>