[vox-tech] macro arguments in C

Peter Jay Salzman vox-tech@lists.lugod.org
Thu, 17 Oct 2002 15:27:48 -0700


begin Mark K. Kim <markslist@cbreak.org> 
> btw, getting rid of "errno" as a part of die's argument was left as an
> excercise to the reader.
> 
> (actually, i just didn't realize you wanted that gone, too, but hey...
> it's a good exercise.)
 
:)

 
 
> On Thu, 17 Oct 2002, Mark K. Kim wrote:
> 
> > It's a hack but it works:
> >
> >    #define die if(\
> >       (die_filename = __FILE__) && \
> >       (die_function = __FUNCTION__) && \
> >       (die_line = __LINE__) \
> >    ) die_for_reals
> >
> >
> >    char* die_filename;
> >    char* die_function;
> >    int die_line;

nice!

> >
> > Note the following:
> >
> >    - "if" is used in the "die" macro to join the macro value store
> >      stage and the "die_for_reals" function call stage.  It should
> >      always evaluate all three conditionals within the if statement,
> >      and they should always evaluate to true, so "die_for_reals"
> >      should always be called.
> >
> >      This "if" trick is necessary.  Otherwise you'd have to have
> >      {} die, like this:
> >
> >         if(condition) { die(errno, "Blah %d", 5); }
> >
> >      which isn't desirable.

very sneaky.  i'm definitely going to store this one away in my bag of
tricks!  thanks for explaining the "if".  i wouldn't have thought of
that.

did you figure this out?  or is there a book of sneaky tricks that this
came from?

> >    - Your die() function had a problem.  The line
> >
> >          vfprintf(stderr, "   %s\n", args);

yeah, this was one of those things where i realized that after i sent
out the email, but didn't want to reply to my own post to correct it.
oh well.  it could've saved me 10 minutes of trying to figure it out.
but it was 10 minutes worth spending.  :)

thanks for the trick -- very cool tip.

pete