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 (18191900)