#define pr(a, b...) printf(a, b) /* (*A) */ #define pr(a, b...) printf(a, ##b) /* (*B) */ pr("Hello\n"); /* (*1) */ pr("Hello %s\n", "World"); /* (*2) */ pr("Hello %s %s\n", "My", "World"); /* (*3) */ Above two kinds of macros looks like same at first look. But, there is difference. In case of (*2) and (*3), (*A) and (*B) both work well. In terms of (*1), it doesn't have second arguement. That is, it doesn't have arugment 'b'. So, let's guess result of preprocessing. Logically, in both case - (*A) and (*B) - "printf(a, )" should be a result, and GCC should complain about this syntax. But, actual result is, (*A) doesn't work, but (*B) works well. I didn't check GCC Spec. for this case but, it's interesting enough to leave post :-).