В процессе освоения расширения GCC для добавления переменного списка аргументов в макросах препроцессора натолкнулся на необходимость перечислять их. Причем несколько раз, в разных местах (в идеале на выводе должен быть многократно повторенный текст для каждого аргумента.
Пока могу брать только список целиком.
Итерация переменного списка аргументов в макросе?
Модератор: Модераторы разделов
-
- Сообщения: 180
- ОС: Gentoo / Calculate
-
- Сообщения: 180
- ОС: Gentoo / Calculate
Re: Итерация переменного списка аргументов в макросе?
Чтоб не мутить, показываю, для чего это нужно.
В конце текста два теста. Первый рабочий, второй недостижимый идеал.
Не знаю, во что это все выльется, пока просто экспериментирую.
Код: Выделить всё
/**
* 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
В конце текста два теста. Первый рабочий, второй недостижимый идеал.
Не знаю, во что это все выльется, пока просто экспериментирую.
-
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Итерация переменного списка аргументов в макросе?
В C/C++ макросы - это нечто ограниченное и жутко нефункциональное. Единственный выход, имхо, это делать methodsContainer1, methodsContainer2, methodsContainer3 и т.д., с разным количеством аргументов.
-
- Сообщения: 180
- ОС: Gentoo / Calculate