我正在尝试编写一个宏,它将自动定义由组合和函数指针存档的多态类型。
我对宏字符串操作不太了解。这就是我对宏定义的想象:
#define INSTANCE(ret, name, ...) ret (*name)(__VA_ARGS__);
#define TYPE(name, ...) typedef struct { Object base; __VA_ARGS__ } name
它可以像下面这样使用:
TYPE(A,
INSTANCE(void, print_name, void),
INSTANCE(void, set_id, char *, id)
);
在本例中,生成的结构应该是:
typedef struct {
Object base;
void (*print_name)(void);
void (*set_id)(char *);
} A;
在我的实现中,编译器返回错误:
main.c:14:38: error: expected specifier-qualifier-list before ‘,’ token
14 | INSTANCE(void, print_name, void),
| ^
这是否意味着“函数指针求值的参数”失败了?我做错了什么?
问题在于您在使用宏时有多余的逗号。你需要像这样使用它:
TYPE(A,
INSTANCE(void, print_name, void) /* no comma here */
INSTANCE(void, set_id, char *, id)
);