c-void*转换用于泛型函数



我正在尝试构建一个通用函数作为下面的函数

struct x {
int l;
char p;
};
struct y {
int l;
char p;
};
void test (void *t, int type)
{
if (type)
(struct y*)t;
else
(struct x*)t;
t->l = 6;
t->p = 'k';
}

与此类似,变量t对于强制转换x*或y*必须具有相同的名称。你知道这是否可能吗?或者有其他建议吗?非常感谢。

这:

(struct y*)t;

不会永久更改t的类型。它获取t的值,将该值的类型从void *转换为struct y *,然后丢弃该值,因为对它没有任何操作

转换指针值后,可以取消对结果表达式的引用,并将其分配给相应的成员。

if (type)
((struct y*)t)->l = 1;
else
((struct x*)t)->l = 1;

或者,您可以将t的值分配给适当类型的变量,并继续使用它:

if (type) {
struct y *y1 = t;
y1->l = 1;
// do more with y1
} else {
struct x *x1 = t;
x1->l = 1;
// do more with x1
}

如果您想要处理具有一些公共成员的两个结构,则需要创建一个具有公共成员的单独结构,并将其包含在两个结构中。

struct z {
int l;
char p;
};
struct x {
struct z z;
int i;
};
struct y {
struct z z;
double j;
};
void test(struct z *t)
{
t->l = 6;
t->p = 'k';
}
int main()
{
struct x x1;
struct y y1;
test((struct z*)&x1);
test((struct z*)&y1);
}

允许以上强制转换,因为指向结构的指针可以安全地转换为指向其第一个成员的指针。

最新更新