https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58844
--- Comment #11 from David Krauss <potswa at mac dot com> --- On 2014–08–12, at 3:10 PM, jakub at gcc dot gnu.org <gcc-bugzi...@gcc.gnu.org> wrote: > Please see https://gcc.gnu.org/ml/gcc-patches/2009-04/msg01490.html for > reasoning why gcc considers it valid. That reasoning goes awry at “ISO C is silent about this possibility.” C and C++ both say, > 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. This is unambiguous in that consecutive ## tokens get pasted; they can’t all be operators. The spec also says, “The order of evaluation of ## operators is unspecified,” which doesn’t seem like much of a constraint but it does suggest that they are evaluated one-by-one. The standard also says “If the result is not a valid preprocessing token, the behavior is undefined,” so no diagnosis is required. However, there have been a couple proposals to make it required, so it’s a very good idea. Even if the user really meant them to be operators, it won’t be portable.