void * cast для функции generi c - PullRequest
       31

void * cast для функции generi c

0 голосов
/ 18 апреля 2020

Я пытаюсь построить обобщенную c функцию, как показано ниже

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 *. У вас есть идея, если это возможно, или есть другие предложения? Спасибо!

1 Ответ

0 голосов
/ 18 апреля 2020

This:

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

Приведенное выше приведение разрешено, поскольку указатель на структуру может быть безопасно преобразованным в указатель на его первый член.

...