(Странно?) Поведение препроцессора GCC

Думаю, большинство из вас, кто работал с C / C ++, имеют интуитивное представление о том, как работает препроцессор (более или менее). Я так думал до сегодняшнего дня, но моя интуиция не оправдалась. Вот такая история:

Сегодня что-то пробовал, но результат не могу объяснить. Сначала рассмотрим следующий код:

#define A B
#define B A

A
B

Что происходит? Что ж, результат после компиляции с флагом -E следующий:

A
B

Хорошо, хорошо, может быть, не то, что кто-то ожидал, но это объяснимо. Я предполагаю, что препроцессор каким-то образом определил, что есть какая-то проблема, и ничего не сделал.

Следующее, что я попробовал, было следующее:

#define A B
#define B A C
#define C x

A
B

Теперь к необъяснимому для меня результату:

A x
B x

Как это произошло? Я не могу понять разумного способа, как это произошло. Первая команда (#define AB) не может быть выполнена, потому что тогда A будет заменено на B, и окончательный результат должен быть одинаковым для обоих. Но если это не так, то «A x» не может произойти!

Мой вопрос: что мне не хватает? Очевидно, я не знаю, как именно работает препроцессор. Известны ли вам какие-либо источники об этом?

13
задан Brian Tompsett - 汤莱恩 5 March 2016 в 22:01
поделиться