[vox-tech] Nifty macro expansion bug

Harold Lee harold at hotelling.net
Fri Jan 19 14:06:26 PST 2007


Peter Jay Salzman wrote:
> On Thu 18 Jan 07,  4:14 PM, Bill Kendrick <nbs at sonic.net> said:
>   
>> So at work, a coworker noticed an issue with the following code:
>>
>>   for (i = 0; i < n; i++)
>>     myFREE(foo[i]);
>>
>> which went away when he wrapped it in braces:
>>
>>   for (i = 0; i < n; i++)
>>   {
>>     myFREE(foo[i]);
>>   }
>>
>> Figured maybe it was a weird compiler bug.  Being author of the myFREE()
>> code -- which happens to be a macro -- I realized immediately what I did
>> wrong.  (And continue to be annoyed with C syntax ;) )
>>
>> See, myFREE() is actually a macro that looks like this:
>>
>>   #define myFREE(x) if ((x) != NULL) FREE(x); x = NULL;
>>
>> Two statements... hence the need for {} around the call to the macro.
>> (Or, more sensibly, including {}s around what the macro expands to.)
>>
>> That was a neat catch. :)
>>     
>  
>
> I ran into something similar, but more complicated, last week.  An
> expression that should've executed didn't.
>
> I looked at the output of "cl.exe -E" (similar to gcc -E) which displays
> what the compiler "sees" after the preprocessor does its thing.  From this
> view, it was easy to see that what looked like:
>
>
>    if ( some condition )
>       die( some error message )
>    else
>       do_something();
>
>
> was arriving at the compiler as:
>
>
>    if ( some condition )
>       if ( lots of stuff )
>          print error message with lots of stuff.
>       else
>          do_something();
>
> So the code needs to look like:
>
>    if ( some condition ) {
>       die( some error message )
>    } else {
>       do_something();
>    }
>
>
> Pete
>
>   
This is why Lisp has those parentheses...   ;-P
And don't get me started about Lisp macros versus the C preprocessor.


More information about the vox-tech mailing list