2012-05-05 2 views
3

В C можно ли объединить каждый из переменных аргументов в переменном макросе?Конкатенация маркеров в вариативных макросах

Пример:

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_AGRS__ 

MY_MACRO(X, Y) yields HDR_X, Y 

Предложения?

+0

Посмотрите http://stackoverflow.com/a/1872506/832273 это, вероятно, поможет –

ответ

3

Во-первых, правило запятой, которое вы упоминаете, является расширением 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 просто подсчитывает количество аргументов
Смежные вопросы