Вы можете применить трюк подсчета аргументов макроса. Для максимум пяти аргументов макроса (исходный ответ поддерживает 4 аргумента макроса, поэтому вы можете просмотреть различие, чтобы увидеть, как расширить макрос для дополнительных аргументов):
#define MACRO(...) MACRO_X(__VA_ARGS__,5,4,3,2,1)(__VA_ARGS__)
#define MACRO_X(_5,_4,_3,_2,_1,X,...) MACRO_##X
#define MACRO_5(X,...) X|MACRO_4(__VA_ARGS__)
#define MACRO_4(X,...) X|MACRO_3(__VA_ARGS__)
#define MACRO_3(X,...) X|MACRO_2(__VA_ARGS__)
#define MACRO_2(X,...) X|MACRO_1(__VA_ARGS__)
#define MACRO_1(X,...) X
Чтобы создать строку, вы можете использовать оператор stringify:
#define STR2(X) STR(X)
#define STR(X) #X
Итак:
puts(STR2(MACRO(a,lot,of,bars)));