Алгоритм раскрытия define'ов
От: glap  
Дата: 26.06.11 17:32
Оценка:
Есть всем известный приём, как преобразовать вложенный 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".

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.