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 is impossible, as impossible as to raise the dead, to restore anything that has ever been great or beautiful in architecture. That which I have ... insisted upon as the life of the whole, that spirit which is given only by the hand and eye of the workman, can never be recalled.
    John Ruskin (1819–1900)