void * 转换为通用函数
void * cast for generic function
我正在尝试构建一个如下所示的通用函数
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);
}
允许上述转换,因为指向结构的指针可以安全地转换为指向其第一个成员的指针。
我正在尝试构建一个如下所示的通用函数
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);
}
允许上述转换,因为指向结构的指针可以安全地转换为指向其第一个成员的指针。