0

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

#ifdef SATHISH
typedef struct{
       int id;
       char name[10];
}data;
#else
typedef struct{
       struct student s1;
       double average;
}data;
#endif

在这种情况下,当SATHISH启用标志时,将评估第一个结构,如果未定义标志,则将评估第二个结构!

#ifdef .... #endif在不使用预处理器指令(如or )的情况下,是否有其他最佳替代方法可以做同样的事情#ifndef .... #endif

任何建议表示赞赏!

4

1 回答 1

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.
您可能还记得, 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;
  }
于 2014-09-02T12:10:08.080 回答