Нет - типы C являются статическими, что означает, что sample
всегда будет иметь тип type_a
.Тем не менее, вы можете достичь того, что вы хотите, используя союзы:
union {
type_a as_a;
type_b as_b;
} sample;
sample.as_a.a = 1;
sample.as_a.b = 2;
sample.as_a.c = 3;
sample.as_b.f[1] = 'a';
Обратите внимание, что обычно не создается объект типа union
, как этот;обычно вы включаете union
в struct
, который включает тег, чтобы вы знали, какой тип объекта в настоящее время:
struct {
enum { TYPE_A, TYPE_B } type;
union {
type_a as_a;
type_b as_b;
} data;
} sample;
/* sample is a TYPE_A right now */
sample.type = TYPE_A;
sample.data.as_a.a = 1;
sample.data.as_a.b = 2;
sample.data.as_a.c = 3;
/* sample is now a TYPE_B */
sample.type = TYPE_B;
sample.data.as_b.f[1] = 'a';