Я думаю, что большинство из вас, кто работал с C/C++, имеют интуицию о том, как работает препроцессор (более или менее). Я так и думал до сегодняшнего дня, но моя интуиция оказалась ошибочной. Вот история:(Weird?) Поведение препроцессора GCC
Сегодня я что-то пробовал, но я не могу объяснить результат. Сначала рассмотрим следующий код:
#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 A B) не может быть выполнена, потому что тогда A будет заменено на B, и конечный результат должен быть таким же для обоих. Но если это не так, то нет никакого способа, чтобы «A x» могло случиться!
Мой вопрос: Что мне не хватает? Очевидно, я не знаю, как именно работает препроцессор. Вы знаете какие-либо источники об этом?
И вот почему #defines нужно избегать ... – Goz
Да, это ДРУГОЙ разум. Не то, чтобы я имел в виду не использовать их вообще. Для некоторых задач они очень полезны (и способ пойти i.m.o.). – George