数据类型的声明不会随着编译后的程序增长,因此您可以根据需要定义数据类型。如果你想不预处理指令的解决方案,也许你正在寻找unions
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
:然后,#if...
声明的语法会更紧凑和可读性。
如您所知,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;
}
目前还不清楚你想解决什么问题。显然,没有办法做*确切*相同的事情,但可能你正在寻找一些*替代* ...它只是不清楚什么。 – 2014-09-02 09:38:49
为什么不坚持使用第二个结构定义并将未使用的字段留空? – Coconop 2014-09-02 09:40:17
你想要c中的命名空间? – 2014-09-02 09:40:48