[comp.lang.c] #define's with variable length argument lists?

foote@miro.Berkeley.EDU (Bill Foote) (11/30/90)

I'd like to add some debugging output to programs that use a library
I've written, using this hack:

:  
:  #defing glorp(a,b,c)  _glorp(__FILE__, __LINE__, a, b, c)
:  
:      <...>
:  
:      glorp(3.1415926, 0x666, "glorp has intelligent error messages!");
:  

This allows glorp to report from where it was called.

That's great, but what if glorp can have a variable-length argument list?
I don't think that #define can handle this...  Can it?  i.e. can I indicate
somehow that the last argument is optional?

I know that I could do the following:

:
:  #define glorp(a)     {  _set_error(__FILE__, __LINE__);      \
:			   _glorp a  }
:
:      <...>
:
:  glorp((27, "This is ugly!"));
:

but this is inefficient, ugly, and breaks all of my existing applications.

Is there some good way around this?  A way that would be invisible to
existing applications (with just an appropriate #define or two in the
right .h file)?

Thanks in advance,

Bill Foote 			    INTERNET:  foote@miro.berkeley.edu
				     - or -    foote@cs.berkeley.edu
				    UUCP:  ..!ucbvax!miro!foote@uunet.uu.net

ckp@grebyn.com (Checkpoint Technologies) (11/30/90)

In article <9340@pasteur.Berkeley.EDU> foote@miro.Berkeley.EDU (Bill Foote) writes:
>:  #define glorp(a,b,c)  _glorp(__FILE__, __LINE__, a, b, c)
>:      glorp(3.1415926, 0x666, "glorp has intelligent error messages!");
>
>That's great, but what if glorp can have a variable-length argument list?
>I know that I could do the following:
>:  #define glorp(a)     {  _set_error(__FILE__, __LINE__);      \
>:			   _glorp a  }
>:  glorp((27, "This is ugly!"));
>but this is inefficient, ugly, and breaks all of my existing applications.

Just off the top of my head...  This may work for you.

: #define glorp _set_error(__FILE__,__LINE__), _glorp

The macro definition specifies _no_ parameters.  Specifically,
whatever parenthesised expression you code following a call to glorp is
not considered part of the macro expansion, but will simply appear as
the parameters to the enclosed trailing call to _glorp.



-- 
First comes the logo: C H E C K P O I N T  T E C H N O L O G I E S      / /  
                                                                    \\ / /    
Then, the disclaimer:  All expressed opinions are, indeed, opinions. \  / o
Now for the witty part:    I'm pink, therefore, I'm spam!             \/