2014-09-02 7 views
0

У меня есть два разных развертывания в моем проекте! для этих двух развертываний у меня разные члены структуры, но с тем же именем структуры. Например, я использую ниже модель для DO-Есть ли другой способ избежать конфликтующих типов, кроме тех, которые используют директивы препроцессора?

#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

Неясно, что проблема, которую вы пытаетесь решить. Очевидно, что нет никакого способа сделать точный то же самое, но, по-видимому, вы ищете какую-то альтернативу ... ... это просто не понятно для чего. –

+0

Почему бы вам просто не придерживаться определения второй структуры и оставить неиспользованные поля пустыми? – Coconop

+0

Вы хотите пространство имен в c? –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^