【问题标题】:void * cast for generic functionvoid * 用于泛型函数
【发布时间】:2020-04-18 17:41:55
【问题描述】:

我正在尝试构建一个如下所示的通用函数

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 必须与 cast x* 或 y* 具有相同的名称。您是否知道这是否可行或有其他建议? 谢谢!

【问题讨论】:

    标签: c pointers struct casting void


    【解决方案1】:

    这个:

    (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);
    }
    

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

    【讨论】:

    • 是的,我理解,但我需要在范围的其余部分保留类型。
    • @Malak 查看我的编辑。您可以将指针分配给正确类型之一并使用它。
    • 我知道并且我知道这一点。但是想象一下两个相同的结构,就像我的问题中的结构一样,在一个对两者执行相同操作但类型不同的函数内部。我需要为两者重复这个过程吗?
    • @Malak C 不能那样工作。两个具有不同名称的结构,即使它们具有相同的成员,也不能相互兼容。最接近的方法是让两个支柱包含第三个作为包含任何公共字段的初始成员。
    • 不明白。看看我为了更清楚而编辑的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多