Сосредоточение внимания на вставке пробелов отсутствует.
Макрос A
определяется как последовательность токенов предварительной обработки -
и B
.
Когда компиляторанализирует фрагмент исходного кода -A
, выдает 2 токена -
и A
.A
расширяется как часть фазы предварительной обработки, и токены преобразуются в токены C: -
, -
и B
.
Если B
сам по себе определен как макрос (#define B 4
), A
расширится до -
, -
, 4
, который будет проанализирован как выражение, оцениваемое в значение 4
с типом int
.
gcc -E
производит текст.Чтобы текст преобразовывался обратно в ту же последовательность токенов, что и исходный исходный код, необходимо вставить пробел между двумя токенами -
, чтобы предотвратить синтаксический анализ --
как одного токена.