I am trying to write a macro which will automate definition of polymorphic types achived by composition and function pointers.
I don't really know a lot about macro string manipulation. This is how I imagine the macro definition:
#define INSTANCE(ret, name, ...) ret (*name)(__VA_ARGS__);
#define TYPE(name, ...) typedef struct { Object base; __VA_ARGS__ } name
It may be used like following:
TYPE(A,
INSTANCE(void, print_name, void),
INSTANCE(void, set_id, char *, id)
);
And generated structure, in this example, should be:
typedef struct {
Object base;
void (*print_name)(void);
void (*set_id)(char *);
} A;
In my implementation compiler returns error:
main.c:14:38: error: expected specifier-qualifier-list before ‘,’ token
14 | INSTANCE(void, print_name, void),
| ^
Did it mean that "arguments to function pointer evaluation" fails? What have I done wrong?
As already stated, you have too many commas in your source code. So either remove them manually or modify your macros to do it for you:
#define REMOVECOMMA2(\
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,...) \
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20
#define REMOVECOMMA(...) REMOVECOMMA2(__VA_ARGS__,,,,,,,,,,,,,,,,,,,,)
#define INSTANCE(ret, name, ...) ret (*name)(REMOVECOMMA(__VA_ARGS__));
#define TYPE(name, ...) typedef struct { Object base; REMOVECOMMA(__VA_ARGS__) } name
TYPE(A,
INSTANCE(void, print_name, void),
INSTANCE(void, set_id, char *, id)
);
Please note that the macros can only remove a limited numbers of commas (in above example: 19)