Aussie AI
Variable-Argument Debug Macros
-
Book Excerpt from "Generative AI in C++"
-
by David Spuler, Ph.D.
Variable-Argument Debug Macros
A neater solution is to use varargs preprocessor macros with the special tokens “...” and “__VA_ARGS__”,
which are standard in C and C++ (since 1999):
#define ydebug(fmt,...) fprintf(stderr, (fmt), __VA_ARGS__ )
...
ydebug("DEBUG: I am here!\n");
That's not especially helpful, so we can add more context:
// Version with file/line/function context
#define ydebug(fmt,...) \
( fprintf(stderr, "DEBUG [%s:%d:%s]: ", \
__FILE__, __LINE__, __func__ ), \
fprintf(stderr, (fmt), __VA_ARGS__ ))
...
ydebug("I am here!\n");
This will report the source code filename, line number, and function name.
Note the use of the comma operator between the two fprintf statements (whereas a semicolon would be a macro bug).
Also required are parentheses around the whole thing, and around each use of the “fmt” parameter.
Here's a final example that also detects if you forgot a newline in your format string (how kind!):
// Version that makes the newline optional
#define ydebug(fmt,...) \
(fprintf(stderr, "DEBUG [%s:%d:%s]: ", \
__FILE__, __LINE__, __func__ ), \
fprintf(stderr, (fmt), __VA_ARGS__ ), \
(strchr((fmt), '\n') != NULL \
|| fprintf(stderr, "\n")))
...
ydebug("I am here!"); // Newline optional
|
• Next: • Up: Table of Contents |
|
The new AI programming book by Aussie AI co-founders:
Get your copy from Amazon: Generative AI in C++ |