我正在尝试创建一个宏来自动创建C中简单“数据库”中不同类型变量的访问器。这是通过结构来完成的:
typedef struct {
int var1;
long var2;
double var3;
int var4;
} dataNames_t;
但为了实现自动化,我想创建一堆宏来模仿函数的重载,这样我就不必拥有单独的getInt
,getBool
,getLong
,等功能。我们经常这样做,所以我们可以非常快速地将条目添加到非常相似的长列表中。这样我们就不必修改文件中的5个位置来添加条目。但是,我似乎无法弄清楚结构。
#define DATA_LIST \
DM(var1, int), \
DM(var2, long), \
DM(var3, double), \
DM(var4, int)
#define DM(y, z) z y;
/* create data structure from the macro */
typedef struct {
DATA_LIST
} dataNames_t;
这个结构应该评估第一个,但是某些东西不能正常工作。
#define DM(y, z) z y##;
也不起作用。
答案 0 :(得分:5)
问题是DM(...)
中每个DATA_LIST
末尾的逗号;你的结构有效地扩展到:
typedef struct {
int var1;,
long var2;,
double var3;,
int var4;
} dataNames_t;
将您的DATA_LIST
更改为:
#define DATA_LIST \
DM(var1, int) \
DM(var2, long) \
DM(var3, double) \
DM(var4, int)
答案 1 :(得分:1)
如果要查看预处理器的输出,请使用gcc中的-E
标志。这在调试宏时非常有用。
但是在这种情况下,问题是这里每行的逗号:
DM(var1, int), \
DM(var2, long), \
DM(var3, double), \
DM(var4, int)
答案 2 :(得分:0)
我怀疑问题是DM()
宏中每个DATA_LIST
后的逗号。
答案 3 :(得分:0)
从DATA_LIST中删除逗号:
#define DATA_LIST \
DM(var1, int), \
DM(var2, long), \
DM(var3, double), \
DM(var4, int)