Вот шаги для составления оператора printf("The value of A is %d\n", A);
:
Эта последовательность макросов раскрывается как токены, а не как последовательность символов, следовательно, A
расширяется не как --5
, а как - -5
. Хорошие компиляторы Си вставили бы дополнительный пробел при предварительной обработке исходного текста для текстового вывода, чтобы гарантировать, что результирующий текст при повторном анализе выдает ту же последовательность токенов. Однако обратите внимание, что в стандарте C ничего не говорится о предварительной обработке для текстового вывода, он только определяет предварительную обработку как один из этапов синтаксического анализа, и это является проблемой качества реализации для компиляторов, чтобы не создавать потенциальных побочных эффектов при предварительной обработке для текстового вывода.
В препроцессоре есть отдельная функция для объединения токенов в новые токены, называемая вставкой токенов. Он требует определенного оператора ##
и довольно сложен в использовании.
Обратите внимание, что макросы должны быть определены с круглыми скобками вокруг каждого аргумента и круглыми скобками вокруг всего раскрытия, чтобы избежать проблем с приоритетами операторов:
#define A (-B)
#define B (-C)
#define C 5