2016-07-02 1 views
0

J'ai un syndicat Je cours un logiciel de vérification de programme, et je voudrais dire quelque chose sur quel membre est actif. J'ai donc essayé d'écrire comme une union marquée:Membre actif dans (taggé) union

struct my_struct { 
    enum my_tag {v1, v2}; 
    struct{ 
     enum my_tag tag; 
     union { 
      type1 v1; 
      type2 v2; 
     }value; 
    }my_taggedunion; 
}; 

et je suis en cours d'exécution d'un logiciel de vérification du programme sur elle. Je voudrais ajouter l'exigence que, si my_taggedunion.tag == v1 alors le membre actif dans l'union devrait être v1.

Je suis en train d'écrire quelque chose comme « si my_taggedunion.tag == v1 alors my_taggedunion.active_member == v1. Quelle est la syntaxe correcte pour la conclusion?

+1

Ce que vous demandez n'est pas clair. Il n'y a pas de champ 'my_taggedunion.active_member'. Que voulez-vous exactement faire quand 'my_taggedunion.tag == v1'? – kaylum

+0

Cela ne dépendrait-il pas de votre logiciel de vérification de programme? – melpomene

+0

Exactement, je demande comment je peux spécifier ce que le membre actif est –

Répondre

3

Il n'y a aucune notion d'un « membre actif » dans la mesure où C est concerné. Notez que selon la norme ANSI C:

Si un pointeur vers une union est coulé au type d'un pointeur sur un élément, le résultat se réfère à ce membre

. (Voir 3.5.2.1 de X3.159-1989 et A8.3 de Kernighan & Ritchie)

Vous devez garder une trace de la partie pertinente de l'union-vous, ce qui dans votre cas, vous faites par my_tag.

+2

Il n'y a pas d'annexe A8 dans la norme. S'il vous plaît fournir une référence correcte. – Olaf