【问题标题】:C macro concatenation to create a structC 宏连接以创建结构
【发布时间】:2011-01-25 00:19:05
【问题描述】:

我正在尝试创建一个宏来自动在 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##;

也不行。

【问题讨论】:

  • 顺便说一句,在 C 中,getter 和 setter 的优点是什么?
  • 诊断预处理错误的简单方法是仅通过预处理器运行您的源代码,然后查看结果。

标签: c macros struct concatenation


【解决方案1】:

问题是DATA_LIST 中每个DM(...) 末尾的逗号;您的结构有效地扩展到:

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)

【讨论】:

    【解决方案2】:

    如果您想查看预处理器的输出,请在 gcc 中使用 -E 标志。这在调试宏时非常有用。

    但是在这种情况下,问题在于这里每一行的逗号:

      DM(var1, int),         \
      DM(var2, long),        \
      DM(var3, double),      \
      DM(var4, int)
    

    【讨论】:

      【解决方案3】:

      我怀疑问题是您的 DATA_LIST 宏中每个 DM() 后面的逗号。

      【讨论】:

        【解决方案4】:

        从 DATA_LIST 中删除逗号:

        #define DATA_LIST        \
          DM(var1, int),         \
          DM(var2, long),        \
          DM(var3, double),      \
          DM(var4, int)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-03
          • 2010-12-08
          • 1970-01-01
          相关资源
          最近更新 更多