C宏根据类型使用参数

时间:2013-09-23 18:39:49

标签: c macros c-preprocessor

我有以下typedef

 typedef struct {   
         const char *name;
         void *variable;
         int type;
         int *present;
  } parse_t;

和具有变量和具有相同名称且带有_b的整数的结构。

例如:

 typedef struct {
     char test[12]; 
     int test_b;

     long id; 
     int id_b;

  } record_t;

我要做的是在parse_t结构中定义记录的宏,它将根据变量的类型编写它;

例如:

    record_t record;

    prase_t parse[] = 
    {
        ROW("TEST", record, test, TYPE_STRING);
        ROW("ID", record, id, TYPE_INT);
    }

ROW执行以下操作:

  • 设置名称值
  • 根据类型,如果是TYPE_STRING,请使用record.<variable>作为变量,否则使用&(record.id)
  • 设置类型值
  • 将_b附加到传递给宏的变量名称并在行中使用它。

我尝试了很多选项,最接近的是以下

 #define ROW(x, y, z, v) {x, (TYPE_STRING == v) ? y.z:&(y.z), v, &(y.z##_b)}

但我在使用它时遇到错误,如下所示

     The ":" operator is not allowed between "char[4]" and "char(*)[4]".

我感谢任何帮助。我想我总是可以使用两个不同的宏,一个用于字符串类型,另一个用于int,例如,但我正在尝试尽可能地简化它。

1 个答案:

答案 0 :(得分:1)

为什么需要TYPE_STRING测试?如果您只是将它转换为void *,则获取数组的地址是一个noop,因为在这种情况下数组将衰减为指针。所以只需使用

#define ROW(x,y,z,v)  { x, &(y.z), v, &(y.z##_b) }