Intereting Posts
Что означает Far в c? pthread с уникальной структурой как параметр C Где постоянный локальный переменный массив входит в память для программы ‘C’ Как использовать побитовые операторы для возврата 0 или 1 Быстрый 24-битный массив -> 32-битное преобразование массива? Как читать .txt-файл или CSV-файл из C-программы? Чтение значений из файла CSV в переменные Преобразовать Маленький Эндиан в Большой Эндиан Переполнение буфера функции sprintf? sizeof long double и точность не соответствует? Почему FT_Read () терпит неудачу в дочернем процессе, но работает в родительском процессе? Как я могу отобразить IP-адрес клиента в отчете с помощью программы c socket? Быстрое сортирование по одинарному списку ссылок Значимы, по крайней мере, первые 31 или 63 символа внутреннего имени? Вычислить произведение двойного слова (подписанное) из двух слов, учитывая нижнее словосочетание

Конкатенация жетонов в вариативных макросах

В 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 просто подсчитывает количество аргументов