Есть всем известный приём, как преобразовать вложенный define в строку или применить оператор ##, чтобы препроцессор его раскрыл, а не впихнул его имя. Например:
#define ARG blabla
#define TO_STR(a) #a
#define USELESS(a) TO_STR(a)
TO_STR(ARG) // == "ARG"
USELESS(ARG) // == "blabla"
В какой момент препроцессор решает, что ARG стоит раскрыть?
По началу я себе представлял поведения препроцеессора при развороте дефайнов примерно так:
1. Подствляет вместо упоминаемых параметров аргументы (т.е. тупо копирование строки).
2. Рекурсивно раскрывает вложенные дефайны слева-на-право.
Но такой алгоритм никак не учитывает "прослоечные" дефайны и вконце концов перед оператором # будет стоять ARG, который он по правилам из стандарта не будет раскрывать, а преобразует в строку "ARG".
Спасибо.