Нет, ваша функция foo
не будет работать, потому что a
находится не в том месте.
Ваш пример четко составлен, и это снизит актуальность моего ответа на проблему.вы действительно пытаетесь решить, но это определение делает что-то вроде того, что, как я полагаю, вы запрашиваете:
struct header {
int a;
int b;
void *c;
};
struct shared_fields {
int a;
int b;
void *c;
/* More fields to follow */
};
typedef struct
{
struct header virtuals;
struct shared_fields shared;
} X;
typedef struct
{
struct shared_fields shared;
} Y;
void foo_low(struct shared *ys)
{
ys->a = 1;
ys->b = 2;
}
void foo(X *x)
{
foo_low(&x->shared);
}
Однако это не выполняет приведение, так как оно не требуется.Если вы действительно намеревались установить данные через одну структуру и получить доступ к ним через другую, это не разрешено в стандарте C (хотя может быть исключение для меток с одинаковой структурой с разными метками, как описано Хьюбертом).
Я подозреваю, что лучшим решением проблемы, о которой вы спрашивали, является использование union
, которое часто можно использовать для выполнения ваших задач.Но, строго говоря, если у вас есть объект u
типа union и вы установили u.a
, доступ к значению u.b
до установки u.b
имеет неопределенное поведение.Хотя обычно люди не беспокоятся об этом.