Согласно стандарту C, результатом оператора предварительной обработки '##
' должен быть 'токен предварительной обработки', или результат не определен (C99 6.10.3.3 (3) - Оператор ##).
Список токенов предварительной обработки (C99 6.4 (3) - Лексические элементы):
имена заголовков, идентификаторы, числа предварительной обработки, символьные константы, строковые литералы, знаки пунктуации и одиночные непробельные символы, которые лексически не соответствуют другим категориям токенов предварительной обработки.
GCC позволяет вам знать, что вы входите в неопределенную территорию. MSVC безмолвно рад неопределенному результату (именно этого вы и ожидаете получить).
Обратите внимание, что если вы все равно не создаете один токен, вам не нужен оператор вставки токена. Как правило (я уверен, что, возможно, есть исключение или два), 2 токена, разделенные пробелами, эквивалентны 2 токенам, не разделенным пробелами - как в вашем примере.