Common Initial Sequence
From C
If you have multiple structs that share a common initial sequence, you can generalize the access to this sequence by either containing the sequence within a sub-struct, or by using a union to contain the structs.
Code sample #1
The following code sample uses a struct to contain the common initial sequence, it's required to position this struct as the first member.
#include <stdio.h> struct common { int flag; int active; }; struct s1 { struct common common; long int ld; }; struct s2 { struct common common; int d; char c; }; struct s3 { struct common common; int x; }; void func(void *p) { struct common *common = p; if (common->active != 1) { puts("Inactive."); return; } switch (common->flag) { case 1: { struct s1 *s1 = p; printf("s1->u: %ld\n", s1->ld); break; } case 2: { struct s2 *s2 = p; printf("s2->d: %d\n", s2->d); printf("s2->c: %d\n", s2->c); break; } case 3: { struct s3 *s3 = p; printf("s3->x: %d\n", s3->x); break; } default: { printf("Unknown flag: %d\n", common->flag); } } } int main(void) { struct s1 s1 = { { .flag = 1, .active = 1 }, 123123123 }; struct s2 s2 = { { .flag = 2, .active = 1 }, 123, 'A' }; struct s3 s3 = { { .flag = 3, .active = 0 }, 999 }; puts("func(&s1)"); func(&s1); puts(""); puts("func(&s2)"); func(&s2); puts(""); puts("func(&s3)"); func(&s3); puts(""); return 0; }
Code sample #2
The following code sample uses a union to contain all the structs that share a common initial sequence, it's required to access the members through the union.
#include <stdio.h> struct common_s { int flag; int active; }; struct s1 { int flag; int active; long int ld; }; struct s2 { int flag; int active; int d; char c; }; struct s3 { int flag; int active; int x; }; union common { struct common_s common; struct s1 s1; struct s2 s2; struct s3 s3; }; void func(union common *p) { if (p->common.active != 1) { puts("Inactive."); return; } switch (p->common.flag) { case 1: { printf("s1->u: %ld\n", p->s1.ld); break; } case 2: { printf("s2->d: %d\n", p->s2.d); printf("s2->c: %c\n", p->s2.c); break; } case 3: { printf("s3->x: %d\n", p->s3.x); break; } default: { printf("Unknown flag: %d\n", p->common.flag); } } } int main(void) { union common u1 = { .s1 = { .flag = 1, .active = 1, 123123123 } }; union common u2 = { .s2 = { .flag = 2, .active = 1, 123, 'A' } }; union common u3 = { .s3 = { .flag = 3, .active = 0, 999 } }; puts("func(&u1)"); func(&u1); puts(""); puts("func(&u2)"); func(&u2); puts(""); puts("func(&u3)"); func(&u3); puts(""); return 0; }
.