带有可以是不同结构的参数的函数

Dan*_*ega 3 c struct pointers

我试图获得一些复杂的功能,我将在这里简化描述:

我有几种不同变量的结构:

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中完成.但是,我在很多方面都在尝试而没有成功.

我应该如何在函数中声明<>以便能够区分不同类型的结构?

Iha*_*imi 5

使用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)

使用泛型void *指针非常危险.此外,并不意味着具有泛型类型,如果您习惯于考虑泛型,那么处理它很困难,但很明显,当您深入理解时,其他解决方案更适合.

注意:恕我直言,这个代码将更加清晰,int print_struct_A(FILE *target, const struct A *const object);并在print()函数内调用它们.

  • 除此之外,在C11中你可以拥有匿名结构.然后结构的成员被视为联合的成员,你可以编写`object.x`而不是`object.ax`. (2认同)