Я работаю над рекурсивным макросом. Однако, похоже, он не рекурсивно расширяется. Вот минимальный рабочий пример, чтобы показать, что я имею в виду:Рекурсивный макрос C не расширен
// ignore input, do nothing
#define ignore(...)
// choose between 6 names, depending on arity
#define choose(_1,_2,_3,_4,_5,_6,NAME,...) NAME
// if more than one parameter is given to this macro, then execute f, otherwise ignore
#define ifMore(f,...) choose(__VA_ARGS__,f,f,f,f,f,ignore)(__VA_ARGS__)
// call recursively if there are more parameters
#define recursive(first,args...) first:ifMore(recursive,args)
recursive(a,b,c,d)
// should print: a:b:c:d
// prints: a:recursive(b,c,d)
recursive
макрос должен расширять себя рекурсивно и всегда сцепить результат, отделенный двоеточием. Однако это не работает. Рекурсивный макрос генерируется правильно (как видно из результата a:recursive(b,c,d)
, который включает в себя хорошо сформированный вызов макроса снова), но сгенерированный рекурсивный вызов is not exansed.
Почему это так и как я могу получить поведение, которое я хочу?
«Я работаю на рекурсивной макрокоманды» - ну, это трудно понять, что сказать :(Нерекурсивные макросы - это PITA. –