Variadic Macro - The Impossible Example

The Impossible Example

Unfortunately it is (still) not possible to write a carefree and secure macro in portable C++:

MYLOG(FormatLiteral, ...) fprintf (stderr, "%s(%d): " FormatLiteral "\n", __FILE__, __LINE__, __VA_ARGS__)

The following application works

MYLOG("Too many balloons %u", 42);

which expands to

fprintf (stderr, "%s(%u): " "Too many balloons %d" "\n", 42);

which is equivalent to

fprintf (stderr, "%s(%u): Too many balloons %d\n", 42);

But look at this application:

MYLOG("Attention!");

which expands to

fprintf (stderr, "%s(%u): " "Attention!" "\n", );

which generates a syntax error. There's no way to fix this behaviour!

GCC supports the following (non-portable) extention:

MYLOG(FormatLiteral, ...) fprintf (stderr, "%s(%u): " FormatLiteral "\n", __FILE__, __LINE__, ##__VA_ARGS__)

which removes the trailing comma when __VA_ARGS__ is empty.

Read more about this topic:  Variadic Macro

Famous quotes containing the word impossible:

    “One can’t believe impossible things.”
    “I daresay you haven’t had much practice,” said the Queen. “When I was your age, I always did it for half-an-hour a day. Why, sometimes I’ve believed as many as six impossible things before breakfast.”
    Lewis Carroll [Charles Lutwidge Dodgson] (1832–1898)