Моя ментальная модель работы препроцессора, по-видимому, неполна, и это сводит меня с ума.
Я хочу объединить два токена, но сначала нужно развернуть второй токен.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Здесь FOO
расширяется до foo_ANSWER
, но я хочу, чтобы он был foo_42
. Поэтому я определяю макрос MERGE
в надежде, что это каким-то образом расширит аргументы перед конкатенацией:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
Но BAR
по-прежнему расширяется до bar_ANSWER
вместо bar_42
. Поэтому я определяю еще один макрос HELPER
:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
И теперь BAZ
успешно расширен до baz_42
. На данный момент это кажется мне волшебным.
Может ли кто-нибудь объяснить это поведение мне? Как правила расширения работают точно?