1

我有以下 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,例如,我试图尽可能地简化它。

4

1 回答 1

1

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

#define ROW(x,y,z,v)  { x, &(y.z), v, &(y.z##_b) }
于 2013-09-23T19:05:33.397 回答