I'm experimenting with macro replacement for functions.
Here is the simple vararg macro definition:
#define FOO(a, ...) printf(a, ##__VA_ARGS__)
So when we define
FOO("1"); //preprocesses to printf("1"), ',' is truncated
FOO("1", 2, 3); //preprocesses to printf("1", 2, 3), ',' is left unchanged
Without ## preceding __VA_ARGS__ the ',' does not truncated. So I expected that ## operator does the job, but its definition in the standard is a bit blurred. Here are some quotes:
6.10.3.3(p2):
if an argument consists of no preprocessing tokens, the parameter is replaced by a placemarker preprocessing token instead
6.10.3.3(p3):
For both object-like and function-like macro invocations, before the replacement list is reexamined for more macro names to replace, each instance of a
##preprocessing token in the replacement list (not from an argument) is deleted and the preceding preprocessing token is concatenated with the following preprocessing token.
From the 2 sections I don't see any reason that in the invokation FOO("1") expands to printf("1"), not printf(1,). __VA_ARGS__ consits of no preprocessing tokens.
So if we define
#define FOO(a, b) printf(a, ##b)
Why does FOO(1,) expand to printf(1,)? b also consits of no preprocessing tokens here.