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:
“There is ... a class of fancies, of exquisite delicacy, which are not thoughts, and to which, as yet, I have found it absolutely impossible to adapt language.... Now, so entire is my faith in the power of words, that at times, I have believed it possible to embody even the evanescence of fancies such as I have attempted to describe.”
—Edgar Allan Poe (18091849)