Default parameters in macros... Is it possible?

A

avasilev

Hi all,

I am upgrading a kind of small logging framework. Until now, the
interface for logging messages takes only a format string, and a
variable argument list (in a similiar way as printf()). The interface
to the code that uses the logging facilites is through macros, i.e. one
ogf the macros looks like this:

#define LOG(fmtString, ...) GlobalLogger.LogToFile(fmtString"\n",
##__VA_ARGS__)

Now I am introducing message types, filtering etc, and need to add one
more parameter to the macros. Of course I can include that parameter in
the variable argument list, but it is good the varaible argument list
to follow the format string. So my question is: Is there a way to
implement the notion of default parameter in the macros, so the new
macros are compatible with the old code that uses them. Any ideas?

Regards
Alex
 
A

Axter

avasilev said:
Hi all,

I am upgrading a kind of small logging framework. Until now, the
interface for logging messages takes only a format string, and a
variable argument list (in a similiar way as printf()). The interface
to the code that uses the logging facilites is through macros, i.e. one
ogf the macros looks like this:

#define LOG(fmtString, ...) GlobalLogger.LogToFile(fmtString"\n",
##__VA_ARGS__)

Now I am introducing message types, filtering etc, and need to add one
more parameter to the macros. Of course I can include that parameter in
the variable argument list, but it is good the varaible argument list
to follow the format string. So my question is: Is there a way to
implement the notion of default parameter in the macros, so the new
macros are compatible with the old code that uses them. Any ideas?

Regards
Alex

Currently, variable argument macros are not part of the C++ standard.
It is part of the C standard, and some compilers like GNU will let you
use variable argument macros in C++ code.

Check out the following logging library:
http://axter.com/ezlogger

The above library uses a temporary object to store some of the
parameters, and then uses the temporary object's methods to call a
variable argument function.
See following link for macro syntax:
http://axter.com/ezlogger/ezlogger__macros_8hpp.htm

Example:
#define EZDBGONLYLOGGERPRINT axter::ezlogger<>(__FILE__, __LINE__,
__FUNCTION__).cprint

To remove above logging from a release version of the code, you can use
the following method:
#define EZDBGONLYLOGGERPRINT if (1);else printf

Most compilers will compile away the above line complete from the
release version of the code.

This method is more portable then using variable argument macro.


----------------------------------------------------------------------------------------
David Maisonave
http://axter.com

Author of Axter's policy based smart pointers
(http://axter.com/smartptr)
Top ten member of C++ Expert Exchange:
http://www.experts-exchange.com/Cplusplus
----------------------------------------------------------------------------------------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,432
Messages
2,571,682
Members
48,796
Latest member
Greg L.

Latest Threads

Top