2010-02-17 10 views
1

J'ai fait une structure pour ints et pointeurs, etc., comme cela pourrait être utilisé dans LISP. Un pointeur est au moins aligné sur 8 octets, donc tag = 0. Un nombre entier est de 29 bits et a une étiquette de 1. D'autres types ont des valeurs d'étiquette différentes.Comment initialiser le second membre d'une structure anonyme en C?

struct Atom{ 
    union{ 
    Pair    *pair; 
    struct{ 
     unsigned  tag  :3; 
     union{ 
     int   val  :29; 
     char   ch; 
     struct{ 
      int   mant :21; 
      Exp   exp  :8; 
     }; 
     }; 
    }; 
    }; 
}; 

Je voudrais les initialiser différemment.

Pour pointeurs:

Atom aPair = {{.pair=0}}; // works 

ou

Atom aPair = {{0}}; //works 

Cela fonctionne parce que, je suppose, GCC suppose que je veux initialiser le premier membre du syndicat.

Je voudrais aussi un entier initialiser - quelque chose comme ceci:

Atom anInt={{ {.tag=1,{.val=0} } }}; 

Je sais que ce n'est pas standard C, mais est-ce possible à toutes les structures anonymes dans GCC?

+0

Il y avait une réponse que j'ai commenté - où est-il allé? Quelqu'un m'a suggéré d'essayer Atom anInt = {. Tag = 1, .val = 0}; Cela n'a pas fonctionné, mais c'était quelque chose que je n'avais pas essayé et j'ai apprécié le fait qu'ils ont pris le temps de lire ma question et de suggérer quelque chose. – philcolbourn

Répondre

2

Il s'agit d'un known bug.

... qui a été corrigé dans gcc 4.6 (en utilisant struct Atom anInt={{ .tag=1, {.val=0} }};).

+0

Merci. Je n'ai pas considéré que le compilateur pouvait être en faute. – philcolbourn