<br><br><div class="gmail_quote">On Fri, Oct 7, 2011 at 10:23 PM, Don Quixote de la Mancha <span dir="ltr"><<a href="mailto:quixote@dulcineatech.com">quixote@dulcineatech.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Fri, Oct 7, 2011 at 10:16 PM, Charles Davis <<a href="mailto:cdavis@mymail.mines.edu">cdavis@mymail.mines.edu</a>> wrote:<br>
><br>
> On Oct 7, 2011, at 11:02 PM, Don Quixote de la Mancha wrote:<br>
>><br>
</div><div class="im">>> If NDEBUG is defined as for a release or profile build, you'll get the<br>
>> following in your preprocessed code, which will be very hard to debug:<br>
>><br>
>> if ( condition )<br>
>>   following_line();<br>
> No it won't. It will look like this:<br>
> if ( condition )<br>
>  (void)0;<br>
><br>
> following_line();<br>
><br>
> That's because, when NDEBUG is defined, assert(3) is defined like so:<br>
><br>
> #define assert(cond) (void)0<br>
<br>
</div>You wrote that as "assert(3)" which suggests you are referring to a<br>
UNIX man page.  When I got bit in the ass by putting assert() in a<br>
conditional, it was with Microsoft Visual C++ 7 or maybe 7.1.<br></blockquote><div><br></div><div>I can't speak for old versions, but at least VS 2010 Express defines assert in non-debug as:</div><div><br></div><div>
#define assert(_Expression)     ((void)0)</div><div><br></div><div>so it looks OK.<br><br>Side note:  if you put a semicolon at the end of your assert, you should also be fine even in the case of empty assert definitions:</div>
<div><br></div><div>if (x)<br>  assert(y);<br>z();<br><br>would become:<br><br>if (x)<br>  ;<br>z();</div></div>