В C, можно ли объединить каждый из переменных аргументов в aa variadic macro?
Пример:
MY_MACRO(A, B, C) // will yield HDR_A, HDR_B, HDR_C MY_MACRO(X, Y) // will yield HDR_X, HDR_Y
Обычный ##
-оператор имеет особое значение для вариативных макросов (исключая запятую для пустого списка аргументов). И конкатенация при использовании с __VA_ARGS__
имеет место только с первым токеном.
Пример:
#define MY_MACRO(...) HDR_ ## __VA_ARGS__ MY_MACRO(X, Y) // yields HDR_X, Y
Предложения?
Во-первых, правило запятой, которое вы упоминаете, является расширением gcc, стандарт C его не имеет и, скорее всего, никогда не будет иметь его, поскольку функция может быть достигнута различными способами.
То, что вы ищете, это мета-программирование с помощью макросов, что возможно, но для этого вам понадобятся некоторые трюки. P99 предоставляет вам инструменты для этого:
#define MY_PREFIX(NAME, X, I) P99_PASTE2(NAME, X) #define MY_MACRO(...) P99_FOR(HDR_, P99_NARG(__VA_ARGS__), P00_SEQ, MY_PREFIX, __VA_ARGS__)
MY_PREFIX
описывает, что нужно делать с отдельными элементами. P00_SEQ
объявляет, как элементы должны быть разделены P99_NARGS
просто подсчитывает количество аргументов