Ответ 1
Это описано в [cpp.rescan]/1-2:
16.3.4 Повторное сканирование и дальнейшая замена
- После замены всех параметров в списке замещения и обработки
#
и##
все маркеры предварительной обработки маркеров помещаются. Затем результирующая последовательность токенов предварительной обработки повторно сканируется вместе со всеми последующими токенами предварительной обработки исходного файла для замены других имен макросов.- Если имя заменяемого макроса найдено во время этого сканирования списка замены (не считая остальных токенов предварительной обработки исходного файла), он не заменяется. Кроме того, если какие-либо вложенные замены встречаются с именем заменяемого макроса, он не заменяется. Эти неперемещаемые маркеры предварительной обработки макросов больше не доступны для дальнейшей замены, даже если они позже (повторно) рассмотрены в контексты, в которых этот токен предварительной обработки имени макроса в противном случае был бы заменен.
(Акцент мой)
Итак: когда TRUE
встречается в коде, он заменяется на FALSE
. Последовательность сканируется, FALSE
заменяется на TRUE
. Последовательность повторно сканируется, TRUE
найден, но больше не имеет права на замену, и поэтому он остается. То же самое относится к расширению FALSE
(с замененными идентификаторами).