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:

    It seems certain, that though a man, in a flush of humour, after intense reflection on the many contradictions and imperfections of human reason, may entirely renounce all belief and opinion, it is impossible for him to persevere in this total scepticism, or make it appear in his conduct for a few hours.
    David Hume (1711–1776)