我有以下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)
我尝试了很多选项,最接近的是以下
#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,例如,但我正在尝试尽可能地简化它。
答案 0 :(得分:1)
为什么需要TYPE_STRING
测试?如果您只是将它转换为void *
,则获取数组的地址是一个noop,因为在这种情况下数组将衰减为指针。所以只需使用
#define ROW(x,y,z,v) { x, &(y.z), v, &(y.z##_b) }