2014-09-02 6 views
0

J'ai deux différents déploiement dans mon projet! pour ces deux déploiement, j'ai des membres de structure différents, mais avec le même nom de structure. Par exemple, je suis en utilisant le modèle ci-dessous pour faire-Existe-t-il un autre moyen d'éviter les types conflictuels autres que l'utilisation de directives de préprocesseur?

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

Dans ce cas, lorsque la structure du drapeau SATHISH permis sera d'abord évaluée, si l'indicateur est pas deuxième structure définie sera évaluée!

Existe-t-il un autre moyen de faire la même chose sans utiliser de directives de préprocesseur (comme #ifdef .... #endif ou #ifndef .... #endif)?

Toute suggestion est appréciée!

+5

On ne sait pas quel est le problème que vous essayez de résoudre. Évidemment, il n'y a pas moyen de faire la même chose, mais vous cherchez probablement une alternative ... ce n'est pas clair pour quoi. –

+0

Pourquoi ne pas vous contenter de la définition de la 2ème structure et laisser les champs inutilisés vides? – Coconop

+0

vous voulez espace de noms dans c? –

Répondre

1

La déclaration des types de données ne développe pas, plus tard, le programme compilé, de sorte que vous pouvez définir autant de types de données que vous le souhaitez. Ensuite, la syntaxe des déclarations #if... serait plus compact et facile à lire:

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 

Si vous voulez une solution sans directives de préprocesseur, vous cherchez peut-être unions.
Comme vous vous en souvenez peut-être, un union est défini de la même manière qu'un struct, mais il fonctionne différemment: ses membres se chevauchent en mémoire (ils partagent les mêmes octets en mémoire).

unions sont principalement utilisés dans ce but d'espace mémoire de sécurité.

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

Si votre compilateur permet structs anonyme en tant que membres de unions, alors la syntaxe peut être plus confortable:

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