Моя ментальная модель работы препроцессора, по-видимому, неполна, и это сводит меня с ума.
Я хочу объединить два токена, но сначала нужно развернуть второй токен.
#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. На данный момент это кажется мне волшебным.
Может ли кто-нибудь объяснить это поведение мне? Как правила расширения работают точно?