Я полагаю, что разработчик выбрал самый простой способ, когда они реализовали эту функциональность, не задумываясь об этом.
Кажется, что первоначальная реализация приземлилась в 2000-07-03 (два десятилетия go!) ). Соответствующая часть выглядит следующим образом ( source ):
for (;;)
{
t = cpp_get_token (pfile);
if (t->type == CPP_GREATER || t->type == CPP_EOF)
break;
CPP_RESERVE (pfile, TOKEN_LEN (t));
if (t->flags & PREV_WHITE)
CPP_PUTC_Q (pfile, ' ');
pfile->limit = spell_token (pfile, t, pfile->limit);
}
Примечательно, что она вспыхивает, когда видит токен CPP_GREATER
(т.е. >
), до резервирование памяти для токена. Это имеет смысл, поскольку нет необходимости выделять память, когда токен не будет записан в буфер.
Тогда, только после зарезервированной памяти, препроцессор проверяет, имеет ли токен предшествующий пробел (t->flags & PREV_WHITE
) и, когда это происходит, записывает символ пробела в буфер.
В результате в < foo / bar >
только пробелы до foo
(то есть после начального <
), /
и bar
сохраняются.