2014-09-02 38 views
0

我在我的项目中有两种不同的部署!对于这两个部署我有不同的结构成员,但具有相同的结构名称。比如我现在用下面的模型做 -除了使用预处理器指令之外,还有其他方法可以避免冲突类型吗?

#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)做出相同的事情?

任何建议表示赞赏!

+5

目前还不清楚你想解决什么问题。显然,没有办法做*确切*相同的事情,但可能你正在寻找一些*替代* ...它只是不清楚什么。 – 2014-09-02 09:38:49

+0

为什么不坚持使用第二个结构定义并将未使用的字段留空? – Coconop 2014-09-02 09:40:17

+0

你想要c中的命名空间? – 2014-09-02 09:40:48

回答

1

数据类型的声明不会随着编译后的程序增长,因此您可以根据需要定义数据类型。如果你想不预处理指令的解决方案,也许你正在寻找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; 
    } 

如果编译器允许匿名structsunions成员,那么语法可以更舒适:

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; 
    } 
相关问题