データ型の宣言は、後でコンパイルされたプログラムでは大きくならないため、必要なだけデータ型を定義できます。次に、#if...
宣言の構文はよりコンパクトで読みやすくなります。
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
プリプロセッサ ディレクティブを使用しないソリューションが必要な場合は、おそらくunions
.
ご存じのとおり、 aunion
は a と同じように定義されていstruct
ますが、動作が異なります。そのメンバーはメモリ内で重複しています (メモリ内で同じバイトを共有しています)。
unions
主にメモリ空間を保護する目的で使用されます。
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;
}
コンパイラが のstructs
メンバーとして匿名を許可している場合unions
、構文はより快適になります。
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;
}