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.

Reply via email to