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

Buy: Generative AI in C++: Coding Transformers and LLMs

Generative AI in C++ The new AI programming book by Aussie AI co-founders:
  • AI coding in C++
  • Transformer engine speedups
  • LLM models
  • Phone and desktop AI
  • Code examples
  • Research citations

Get your copy from Amazon: Generative AI in C++