Итерация переменного списка аргументов в макросе?

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Итерация переменного списка аргументов в макросе?

Сообщение nick87720z »

В процессе освоения расширения GCC для добавления переменного списка аргументов в макросах препроцессора натолкнулся на необходимость перечислять их. Причем несколько раз, в разных местах (в идеале на выводе должен быть многократно повторенный текст для каждого аргумента.
Пока могу брать только список целиком.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Итерация переменного списка аргументов в макросе?

Сообщение nick87720z »

Чтоб не мутить, показываю, для чего это нужно.

Код: Выделить всё

/**
 * Convenience overlay for simple cases
 *
 * Specification.
 * - Method includes function and its pointer
 * - Pointers are stored in container struct, object struct has pointer for
 *
 * Class creation.
 * - Declare function(s)
 * - Create initialized container for methods pointers (methodsContainer) with pointers (struct_Method)
 * - Define "object" structure (defClass)
 *
 * Instantiation.
 * - Create class structure or reallocate existing structure with bigger size
 * - Initialize pointer by methods container
 *
 * Call: use (struct_do)
 */

/** Call structure method */
#define struct_do( obj, method, args... ) \
obj->methods->method (obj, ## args)

/** ====================
 *  :::: Atomic API ::::
 *  ====================
 **/

/** Declare methods container */
#define methodsContainer( type ) \
struct type ## _ ## methods ## _tag type ## _ ## methods; \
struct type ## _ ## methods ## _tag

/** UNUSED: Get function name for method. */
#define memberFuncName( type, method ) \
type ## _ ## method

/** Declare pointer for existing function */
#define struct_Method( method, func ) \
typeof (& func) method

/** Define "object" structure */
#define objStruct( name ) \
typedef struct {           \
  name data;                \
  typeof                    \
   (& type ## _ ## methods) \
   methods;                 \
} name ## _ ## class

/** ==================
 *  :::: Meta API ::::
 *  ==================
 **/

/* TODO */

#if 1 /** :::: REAL: Tests and examples :::: **/
*************** SEPARATOR =)) ****************

void myType_myMethod1 (void);
void myType_myMethod2 (void);
void myType_myMethod3 (void);

methodsContainer( myType )
{
  struct_Method (myMethod1, myType_myMethod1);
  struct_Method (myMethod2, myType_myMethod2);
  struct_Method (myMethod3, myType_myMethod3);
};
myType_methods = {myType_myMethod1, myType_myMethod2, myType_myMethod3};

objStruct (myType);

#endif
#if 1 /** :::: WANTED: Tests and examples :::: **/
*************** SEPARATOR =)) ****************

void myType_myMethod1 (void);
void myType_myMethod2 (void);
void myType_myMethod3 (void);

methodsContainer( myType, myMethod1, myMethod2, myMethod3 );

objStruct (myType);

#endif

В конце текста два теста. Первый рабочий, второй недостижимый идеал.
Не знаю, во что это все выльется, пока просто экспериментирую.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Итерация переменного списка аргументов в макросе?

Сообщение serzh-z »

В C/C++ макросы - это нечто ограниченное и жутко нефункциональное. Единственный выход, имхо, это делать methodsContainer1, methodsContainer2, methodsContainer3 и т.д., с разным количеством аргументов.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Итерация переменного списка аргументов в макросе?

Сообщение nick87720z »

serzh-z писал(а):
27.02.2011 20:41
Единственный выход, имхо, это делать methodsContainer1, methodsContainer2, methodsContainer3 и т.д., с разным количеством аргументов.

Заяц в летаргическом шоке :D
Реально подумываю об использовании внешних макропроцессоров для сборки (не только конфигурации).
Спасибо сказали: