Может кто-нибудь объяснить мне, почему два оператора конкатенации не выдают какой-либо ошибки препроцессором?:
#define Z(x) x ## ## 3
Z(3)
приводит к:
33
Стандарты говорят, что:
... каждый экземпляр маркера предварительной обработки ## в списке заметок (не из аргумента) удаляется, а предыдущая предварительная обработка токен объединен с следующим токеном предварительной обработки
поэтому я ожидал бы, что preproceror сначала попытается выполнить x
со вторым ##
, который кажется странным. Это не дает никакого действительного токена, поэтому я бы ожидал хотя бы предупреждения. Ни gcc, ни VC не выдают никаких предупреждений.
Я был бы признателен за некоторое объяснение того, как это работает и почему.
В стандарте упоминаются временные токены placemaker
, которые объяснят, почему это работает, но должен быть один такой токен между двумя "двойными острыми". Проблема в том, что токены placemaker
генерируются, когда параметр не содержит токенов, и между обоими операторами concat нет параметра.