http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48741
vjeux <vjeuxx at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|c |c++0x ##__VA_ARGS__ no | |longer remove , without | |arguments --- Comment #1 from vjeux <vjeuxx at gmail dot com> 2011-04-23 10:41:10 UTC --- In C99, when using ##__VA_ARGS__ in a variadic macro has a special feature. If the macro is called with 0 arguments AND there is a comma before, then it is removed. This is a handy feature that is no longer working with std=c++0x. I believe that this is an unintentional feature and that it should be fixed. TEST CASE -------------------------------- test.cpp #define variadic(...) func(first, ##__VA_ARGS__) variadic() variadic(1) variadic(1, 2) == Output of std=C++0x (Bug) > cpp test.cpp -std=c++0x func(first,) func(first,1) func(first,1, 2) == Output (Expected) > cpp test.cpp -std=c99 func(first) func(first,1) func(first,1, 2) > cpp --version cpp (GCC) 4.7.0 20110419 (experimental) DOCUMENTATION --------------- http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html Second, the `##' token paste operator has a special meaning when placed between a comma and a variable argument. If you write #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__) and the variable argument is left out when the eprintf macro is used, then the comma before the `##' will be deleted. This does not happen if you pass an empty argument, nor does it happen if the token preceding `##' is anything other than a comma.