A quoi servent les structures et les unions anonymes en C11?

C11 ajoute, entre autres, «Structures et unions anonymes».

Je me suis penchée sur la question, mais je n’ai pas trouvé d’explication claire sur le moment où des structures anonymes et des syndicats seraient utiles. Je demande parce que je ne comprends pas complètement ce qu’ils sont. Je comprends que ce sont des structures ou des unions sans nom après, mais j’ai toujours (dû?) Traiter cela comme une erreur, donc je ne peux concevoir qu’une utilisation pour des structures nommées.

L’union interne des structures est très utile dans la pratique. Considérez que vous voulez implémenter un type de sum discriminé (ou union balisée ), un agrégat avec un booléen et un float ou un char* (c’est-à-dire une chaîne), en fonction de l’indicateur booléen. Avec C11, vous devriez pouvoir coder

 typedef struct { bool is_float; union { float f; char* s; }; } mychoice_t; double as_float(mychoice_t* ch) { if (ch->is_float) return ch->f; else return atof(ch->s); } 

Avec C99, vous devrez nommer l’union et coder ch->uf et ch->us qui est moins lisible et plus verbeux.

Une utilisation typique et réelle des structures et unions anonymes consiste à fournir une vue alternative aux données. Par exemple, lors de l’implémentation d’un type de point 3D:

 typedef struct { union{ struct{ double x; double y; double z; }; double raw[3]; }; }vec3d_t; vec3d_t v; vx = 4.0; v.raw[1] = 3.0; // Equivalent to vy = 3.0 vz = 2.0; 

Ceci est utile si vous vous connectez au code qui attend un vecteur 3D comme pointeur sur trois doubles. Au lieu de faire f(&v.x) qui est moche, vous pouvez faire f(v.raw) ce qui rend votre intention claire.

 struct bla { struct { int a; int b; }; int c; }; 

le type struct bla a un membre d’un type de structure anonyme C11.

struct { int a; int b; } struct { int a; int b; } n’a pas de tag et l’object n’a pas de nom: c’est un type de structure anonyme.

Vous pouvez accéder aux membres de la structure anonyme de cette manière:

 struct bla myobject; myobject.a = 1; // a is a member of the anonymous structure inside struct bla myobject.b = 2; // same for b myobject.c = 3; // c is a member of the structure struct bla 

Eh bien, si vous déclarez une seule fois les variables de cette structure dans votre code, pourquoi a-t-il besoin d’un nom?

 struct { int a; struct { int b; int c; } d; } e,f; 

Et vous pouvez maintenant écrire des choses comme ea , fdb , etc.

(J’ai ajouté la structure interne, car je pense que c’est l’un des usages les plus courants des structures anonymes)

 struct Lock; int lock(Lock*); ... struct Queue { Lock; char buf[QBUFSIZE]; char *rp; char *wp; } qputc(Queue* q, char c){ lock(q); ... } 

update3 : ken c le fait depuis un moment – par exemple, pour comstackr ceci et cela .