我试图获得一些复杂的功能,我将在这里简化描述:
我有几种不同变量的结构:
struct param1 {
int varA;
int varB;
}p1;
struct param2 {
int varX;
int varY;
int varZ;
}p2;
Run Code Online (Sandbox Code Playgroud)
而另一方面,我有一个必须使用这些结构的函数,让我们简化它们只是打印数据:
void function(int type_of_structure, <<struct param>>)
Run Code Online (Sandbox Code Playgroud)
然后,函数应该执行以下操作:切换结构类型,并相应地打印值.
switch(type_of_structure)
{
case 1:
printf("param.varA = %d \n",param.varA);
printf("param.varB = %d \n",param.varB);
case 2:
printf("param.varX = %d \n",param.varX);
printf("param.varY = %d \n",param.varY);
printf("param.varZ = %d \n",param.varZ);
}
Run Code Online (Sandbox Code Playgroud)
我知道可以使用带有void**参数和强制转换的函数在C中完成.但是,我在很多方面都在尝试而没有成功.
我应该如何在函数中声明<>以便能够区分不同类型的结构?
使用union,这才是真正的Ç方式.
#include <stdio.h>
enum struct_type {
STRUCT_TYPE_A, STRUCT_TYPE_B
};
struct A {
int x;
int y;
};
struct B {
int x;
int y;
int z;
};
union C {
struct A a;
struct B b;
};
void
print(enum struct_type type, union C object)
{
switch (type) {
case STRUCT_TYPE_A:
fprintf(stdout, "(x, y) = %d, %d\n", object.a.x, object.a.y);
break;
case STRUCT_TYPE_B:
fprintf(stdout, "(x, y, z) = %d, %d, %d\n", object.b.x, object.b.y, object.b.z);
break;
}
}
int
main(void)
{
union C a = {.a = {1, 2}};
union C b = {.b = {3, 4, 5}};
print(STRUCT_TYPE_A, a);
print(STRUCT_TYPE_B, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在c中使用泛型void *指针非常危险.此外,c并不意味着具有泛型类型,如果您习惯于考虑泛型,那么处理它很困难,但很明显,当您深入理解时,其他解决方案更适合.
注意:恕我直言,这个代码将更加清晰,int print_struct_A(FILE *target, const struct A *const object);并在print()函数内调用它们.
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |