La déclaration des types de données ne développe pas, plus tard, le programme compilé, de sorte que vous pouvez définir autant de types de données que vous le souhaitez. Ensuite, la syntaxe des déclarations #if...
serait plus compact et facile à lire:
typedef struct{
int id;
char name[10];
} data_version_1_t;
typedef struct{
struct student s1;
double average;
} data_version_2_t;
#ifdef SATHISH
typedef data_version_1_t data;
#else
typedef data_version_2_t data;
#endif
Si vous voulez une solution sans directives de préprocesseur, vous cherchez peut-être unions
.
Comme vous vous en souvenez peut-être, un union
est défini de la même manière qu'un struct
, mais il fonctionne différemment: ses membres se chevauchent en mémoire (ils partagent les mêmes octets en mémoire).
unions
sont principalement utilisés dans ce but d'espace mémoire de sécurité.
typedef enum { version_1, version_2, } version_e;
typedef struct {
version_e v;
union {
struct{ int id; char name[10]; } d1;
struct{ int s1; double average; } d2;
} u;
} data;
data person;
person.v = version_1;
if (person.v == version_1) {
person.u.d1.id = 1234;
}
person.v = version_2;
if (person.v == version_2) {
person.u.d2.average = 12.34;
}
Si votre compilateur permet structs
anonyme en tant que membres de unions
, alors la syntaxe peut être plus confortable:
typedef enum { version_1, version_2, } version_e;
typedef struct {
version_e v;
union {
struct{ int id; char name[10]; }; // Unnamed struct
struct{ struct student s1; double average; }; // Unnamed struct
} ; // Unnamed union
} data;
data person;
person.v = version_1;
if (person.v == version_1) {
person.id = 1234;
}
person.v = version_2;
if (person.v == version_2) {
person.average = 12.34;
}
On ne sait pas quel est le problème que vous essayez de résoudre. Évidemment, il n'y a pas moyen de faire la même chose, mais vous cherchez probablement une alternative ... ce n'est pas clair pour quoi. –
Pourquoi ne pas vous contenter de la définition de la 2ème structure et laisser les champs inutilisés vides? – Coconop
vous voulez espace de noms dans c? –