数据类型的声明不会增长,以后编译程序,所以你可以定义尽可能多的数据类型。然后,#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;
}