  | 
   Macros With A Variable Number Of Arguments... 
   Submitted by  |   
  
  
A friend just asked me if it would be possible to use the ellipsis (...) in a
macro's parameter list, just like it is used in the printf() function:
  
int printf(const char* fmt, ...);   |  
  
 
     The answer is NO. You can't do that with a macro. There's a nice workaround
that I've used now and then, though. It uses the fact that, when parsing the
parameters passed into a macro, the C preprocessor parses nested sets of
parenthesis, and will not use the commas found inside of those nested
parenthesis to separate the parameters. So, for example, my solution for a
simple printf() wrapper would be something like this:
  
bool g_DoLog = false;
#define LogPrintf(a) if (!g_DoLog) {} else printf a  |  
  
 
     Now, you can use the macro like this:
 
 g_DoLog = true;
..
LogPrintf(("Hello %s\n", "World"));  |  
  
 
     Note that the macro above has complete function semantics: each parameter is
only evaluated once, it requires the semicolon and it is a single statement. The
double parenthesis are necessary in the general case., but they can be obviated
in this example by doing it like this:
 
 #define LogPrintf if (!g_DoLog) {} else printf
..
LogPrintf("Hello %s\n", "World");  |  
  
 
     This requires the multiple parameters to go at the end, however, which may
not be always possible.
     You can also have other non-variable parameters in the macro:
 
 int g_LogLevel = 0;
#define LogPrintf(l,a) if (g_LogLevel < (unsigned int)(l)) {} else printf a
..
LogPrintf(3, ("Hello %s\n", "World"));  |  
  
 
   The double parenthesis are necessary in this case. Still, this can also be
done as follows:
 
 unsigned int g_LogLevel = 0;
#define LogPrintf(l) if (g_LogLevel <= (unsigned int)(l)) {} else printf
..
LogPrintf(3)("Hello %s\n", "World");  |  
  
 
   The possibilities are actually quite endless.
  Salutaciones, 
 JCAB
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |