http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56825
Harald van Dijk <harald at gigawatt dot nl> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |harald at gigawatt dot nl --- Comment #3 from Harald van Dijk <harald at gigawatt dot nl> 2013-04-03 17:31:26 UTC --- For the related #define foo(x, y) x ## y both foo(f,oo(,)) and foo(,foo(,)) expand similarly to foo(,) and in that case, that is the only valid expansion in standard C (C99, anyway). The macro argument foo(,) is not expanded during argument substitution because it is an operand of a ## operator. The macro argument is not expanded after argument substitution because that happens in the context of another expansion of the same foo macro. > But IMHO this statement is relevant to the macro itself and should not apply > to the argument of the macro That is exactly what it is meant to apply to. #define A 1 #define B 2 #define AB 3 #define C(a, b) a ## b C(A, B) must expand to 3. Neither A nor B is allowed to be expanded here before concatenation takes place. AB must be expanded after that, as long as no other expansion of AB is already taking place. That said, , ## x is a GNU extension that never concatenates (except for the rare case where x is an empty macro argument), so the standard cannot and does not require it to behave exactly the same way as the concatenation operator.