Я пытаюсь создать общую функцию, как показано ниже
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 ответ
Этот:
(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);
}
Приведенное выше приведение разрешено, потому что указатель на структуру можно безопасно преобразовать в указатель на ее первый член.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.