 <p><strong>Neither are safe</strong>. Please avoid flashy <code>max</code> macro implementations that rely on non-standard C extensions like <em>expression statements</em> which will give you all sort of headaches if you ever have to port your code to a different platform. Doing my best to present this answer from becoming a rant, the <code>max</code> macro is, in my opinion, one of the worst things in C standard libraries due to its potential side-effects. In times past, I've #<code>undef</code>ed <code>max</code> just to be on the safe side.</p> <p>Your're better off coding the second macro <code>maxint</code> as a function as it has all the drawbacks of macros (e.g. can't debug easily, instantiated variables clashing with locals) but none of the benefits (e.g. genericisation).</p> <p><strong>Alternatives</strong>:</p> <p>My favourite: use the ternary inline: <code>a &gt; b ? a : b</code> where you can drop the parentheses to taste since you know exactly what is going on. It will also be faster than macros that try to be safe by taking value copies.</p> <p>Build your own functions. Consider defining <code>max</code> for integral types and <code>fmax</code> for floating point. There is already a precedent here with <code>abs</code> and <code>fabs</code>.</p>