C宏连接创建结构

时间:2011-01-25 00:19:05

标签: c macros struct concatenation

我正在尝试创建一个宏来自动创建C中简单“数据库”中不同类型变量的访问器。这是通过结构来完成的:

typedef struct {
    int var1;
    long var2;
    double var3;
    int var4;
} dataNames_t;

但为了实现自动化,我想创建一堆宏来模仿函数的重载,这样我就不必拥有单独的getIntgetBoolgetLong,等功能。我们经常这样做,所以我们可以非常快速地将条目添加到非常相似的长列表中。这样我们就不必修改文件中的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##;

也不起作用。

4 个答案:

答案 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)