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

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

0
Malak 18 Апр 2020 в 20:41

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

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

0
dbush 18 Апр 2020 в 18:16