【发布时间】:2012-01-05 22:29:57
【问题描述】:
我只想解析一些可以以两种类型之一存在的数据。第一个是
struct typeA {
int id,
char name[16],
int value1,
int value2,
int value3,
int value4
} __attribute__ ((packed));
第二种可能是数据的形式是双名长度
struct typeB {
int id,
char name[32],
int value1,
int value2,
int value3,
int value4
} __attribute__ ((packed));
到目前为止一切顺利。现在我有两个函数可以解析这两个
int parse_typeA(struct typeA *x){ /* do some stuff */ }
int parse_typeB(struct typeB *x){ /* do some stuff */ }
如果你有更多类型,这显然是不切实际的。如何使用一个函数和一个附加参数(如
)实现两种类型的解析int parse_any_type(void *x, int type){
/*
* WHAT TO DO HERE ??
*
* The following doesn't work
*
* if(type == 1)
* struct typeA *a = (struct typeA *)x;
* else
* struct typeB *a = (struct typeB *)x;
*/
printf("%i\n", a->id);
printf("%s\n", a->name);
printf("%i\n", a->value1);
printf("%i\n", a->value2);
printf("%i\n", a->value3);
printf("%i\n", a->value4);
}
有人知道吗?
【问题讨论】:
-
您会在网站上找到许多关于让 c 进行面向对象编程的问题。尽管您不能完全满足您的要求,但您正以此为起点。也就是说,它通常比它的价值更麻烦。对于一个真正的项目,为什么不直接使用 c++?毕竟,多态性是它添加的东西之一。
-
@dmckee - 你怎么知道这不是一个“真正的项目”?
-
我猜你是对的。使用普通 C 似乎这几乎是不可能的。我只是不想放弃:-)
-
@James:我不知道,我也不做任何判断。我调整这个建议是因为彼得可能正在为他自己的启迪而解决这个问题,在这种情况下,这个建议是毫无意义的。
-
函数名说你想解析数据,但是你的示例函数说你想做相反的事情(即serialise)——这个可能的解决方案有很大的不同。你真正需要哪一个?
标签: c parameters struct conditional