除了使用预处理器指令之外,还有其他方法可以避免冲突类型吗?

时间:2014-09-02 09:37:18

标签: c preprocessor-directive ifdefine

我的项目中有两个不同的部署!对于那两个部署,我有不同的结构成员,但具有相同的结构名称。例如,我使用以下模型来做 -

#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)时,还有其他最佳替代方法可以做同样的事情吗?

任何建议都表示赞赏!

1 个答案:

答案 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;
  }