我的项目中有两个不同的部署!对于那两个部署,我有不同的结构成员,但具有相同的结构名称。例如,我使用以下模型来做 -
#ifdef SATHISH
typedef struct{
int id;
char name[10];
}data;
#else
typedef struct{
struct student s1;
double average;
}data;
#endif
在这种情况下,当评估启用SATHISH
标志的第一个结构时,如果未定义标志,则将评估第二个结构!
在使用预处理程序指令(例如#ifdef .... #endif
或#ifndef .... #endif
)时,还有其他最佳替代方法可以做同样的事情吗?
任何建议都表示赞赏!
答案 0 :(得分:1)
数据类型的声明后来不会增长,编译后的程序,因此您可以根据需要定义数据类型。然后,#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
正如您可能记得的那样,union
的定义方式与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;
}