10
votes

Pourquoi les syndicats anonymes mondiaux doivent-ils être déclarés statiques?

C ++ 0x brouillon

9.5.6 Les syndicats anonymes déclarés dans un espace de noms nommé ou dans l'espace de noms global doivent être déclarés statiques.

Pourquoi est-ce?


0 commentaires

5 Réponses :


2
votes

Mes meilleurs devinations:

Si c'était non statique, cela pourrait être référencé par un autre code. Mais qu'est-ce qu'un autre code l'appellerait? C'est anonyme. Par conséquent, la nécessité de restreindre une union anonyme à une portée locale; Par conséquent, il sera déclaré statique.

Mais c'est juste une supposition. Les concepteurs de langue ont pour concevoir des choses comme elles veulent. Parfois, leurs choix sont arbitraires, juste parce que certains le choix doivent être faits.


2 commentaires

Je ne vois pas comment ce qu'on appelle dans une autre partie du code pourrait être le problème - car il n'est pas appelé quoi que ce soit. Plutôt, seuls les membres sont référencés directement et ils ont tous des noms. C'est l'union elle-même qui est Anon, pas ses membres.


Je suppose que j'essaie d'obtenir des informations sur la raison pour laquelle cette fonctionnalité est conçue comme elle est. BTW Ce comportement n'est pas nouveau à C ++ 0x (même si j'ai cité le projet C ++ 0x) - il a été réparti cela depuis un moment maintenant.



0
votes

9,5 $ / 5- une union de la forme Union { membre-spécification}; est appelé un Union anonyme; Il définit un objet sans nom de type Sans nom .

Je suppose que cela devrait être statique afin que l'objet puisse être initialisé conformément à la règle des objets statiques mondiaux. Si ce n'est pas statique et que l'objet n'a pas de nom, alors comment l'initialise-t-on?

Edit2:

à repenser ...

Les membres des syndicats anonymes ont un lien interne. En outre, par défaut Les noms globaux ont une liaison externe à moins qu'elles ont une liaison interne. Si le nom de l'Union anonyme a une liaison externe, il n'est pas possible pour les membres de l'Union anonyme d'avoir un lien interne. Par conséquent, les syndicats anonymes sont déclarés avec le spécificateur de classe de stockage «statique» de sorte que le nom anonyme lui-même ait une liaison interne.


4 commentaires

mince!. Je ne sais pas comment se débarrasser de ce double "définit"


La fabrication de la statique lui fournira une «initialisation zéro». Mais pourquoi l'initialisation par défaut (zéro) est-elle nécessaire? Ses membres peuvent être mentionnés par leurs noms. La première fois qu'un membre de l'Anon-Union est attribué une valeur, l'Anon-Union sera initialisée. Qu'est-ce que je rate?


@Vatsan Madhavan: la mission est différente de l'initialisation


Vous avez raison. Mais..qui est faux avec une union anonyme mondiale ininitialisée?



2
votes

Je suppose que s'il était autorisé à définir l'Union de manière non statique, il peut violer le ODR (une règle de définition)


0 commentaires

8
votes

Supposons que les syndicats anonymes ne soient pas déclarés statiques et que le compilateur rencontre ces deux unités de traduction (après prétraitement):

fichier1: xxx

fichier2: xxx

sont ces deux syndicats un un même objet, ou sont-ils censés être des objets différents?

Je pense que, afin d'éviter toute personne sans réponse. Des questions telles que celles-ci, il a été décidé que les syndicats anonymes d'espace d'espace de noms doivent être déclarés statiques.


0 commentaires

-1
votes

Il n'y a jamais eu de justification de l'exigence statique et il devrait être supprimé. Le compilateur fait et devrait, traiter les multiples éléments de l'Union comme plusieurs variables mondiales individuelles partageant la même adresse. En praticité, cela signifie que le compilateur permet d'appliquer plusieurs types à appliquer à la même adresse. Étant donné que la portée d'une union anonyme globale est la portée globale, les règles de nommage des éléments de syndicats anonymes devraient être (et sont) de même que les règles de nommer des variables mondiales. I.E. Les noms d'éléments syndicaux anonymes doivent être uniques. En ce qui concerne l'initialisation de l'Union - il n'y a pas de différence entre l'initialisation d'un syndicat et une variable simple. Un autre point sur les syndicats statiques - la valeur et le type d'un syndicat dépendent du temps. Notez qu'une seule valeur à la fois peut occuper un syndicat quel que soit le nombre d'éléments. La raison de déclarer un syndicat à commencer est de permettre l'utilisation de la même adresse pour différents types, de manière dynamique, à des moments différents. C'est pourquoi un syndicats statiques est un malin et certains compilateurs l'ignorent simplement.


0 commentaires