0

私のプロジェクトには2つの異なる展開があります! これらの 2 つの展開では、構造メンバーが異なりますが、構造名は同じです。たとえば、私は以下のモデルを使用しています-

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

この場合、SATHISHフラグを有効にすると最初の構造が評価され、フラグが定義されていない場合は 2 番目の構造が評価されます。

#ifdef .... #endifプリプロセッサ ディレクティブ (またはなど)を使用せずに同じことを行うための他の最良の方法はあります#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 に答える