Ce n' “statique " enum” signifie en C++?
Je suis récemment tombé sur ceci:
static enum Response{
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
Il compile et fonctionne sous Microsoft VS2005. Cependant, je ne suis pas sûr de ce que la "statique" modificateur est censé faire. Est-elle différente de la suivante?
enum Response {
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
- Est-il dans un fichier d'en-tête ou un fichier cpp?
- Juste essayé dans Visual Studio 2008 et il compile sans plainte il y a trop. Bizarre.
- Afin de clarifier son dans une .fichier cpp et il n'y a aucun nom de la variable entre}; et Ce n'est pas une déclaration de variable.
- Tous les compilateurs ont des bugs 🙂
- La page msdn détaillant comment déclarer une
enum
dans VS2005, VS2008, et VS2010 (msdn.microsoft.com/en-us/library/2dzy4k6e.aspx) ne fait aucune mention destatic
. Probablement un bug qu'il permet, à l'époque.
Vous devez vous connecter pour publier un commentaire.
Que le code exact, avec juste les points de suspension supprimé, n'est pas valide en C++. Vous ne pouvez pas utiliser la
static
classe de stockage spécificateur dans unenum
déclaration; il n'a pas de sens il y a (seulement des objets, des fonctions et des syndicats peuvent être déclarésstatic
).Cependant, vous pouvez déclarer une
enum
et à toutes les variables en une seule déclaration:La
static
ici s'applique àx
et c'est effectivement le même que si vous avez dit:Étonnamment, vous pouvez mettre d'autres spécificateurs de decl là aussi.
Cette compile bien dans VS2008:
Mais il ne fait aucun sens du tout 🙂
Je soupçonne que le problème ici, c'est dans l'analyse, parce que le code comme ceci:
Peut aussi être écrite comme:
Fait intéressant, j'ai un avis, si vous faites cela dans VS2008:
De sorte qu'ils ne sont pas d'équivalent que dans le
TestEnum4
cas, il semble être de jeter leconst
decl-spécificateur de. Tous très étrange.Vous ne pouvez pas définir
static
enum en C++.static
ne peut être que le variable de l'enum, pas la type lui-même!De la compilation de votre code avec
GCC
version4.3.4
, il donne cette erreur:Voyez-vous en ligne à ideone: http://www.ideone.com/cI1bt
Je crois que tout est dit.
--
Cependant, si vous souhaitez limiter le type
enum Response
dans sa propre unité de traduction, vous pouvez utiliser sans nom d'espace de noms. Jetez un oeil à ce sujet:La supériorité de sans nom d'espace de noms plus statique?
static
enum et plus importanly exactement ce qu'il signifie. Il fait le variable statique, pas le type lui-même.Standard
La C++11 N3337 projet de norme Annexe C 7.1.1 dit qu'il a été autorisé en C, mais n'avait aucun effet, et est devenu illégal en C++:
Et comme
struct
,enum
est aussi une déclaration de type.De mise en œuvre de justification
Enum définitions ont pas de stockage, et de ne pas générer des symboles dans des fichiers objets comme les variables et les fonctions. Juste essayez de compiler et de décompilation:
avec:
et vous verrez qu'il n'y a pas de
S
symbole, mais il y a uni
symbole.Lorsque le compilateur voit les valeurs de l'enum, c'est juste l'insère littéralement dans le code compilé. Cela ne fonctionne que bien sûr, parce qu'ils sont des constantes de compilation.
Ils doivent donc être inclus sur les fichiers d'en-tête.
Voir aussi:
static struct
dans C: Pourquoi et quand utiliser des structures statiques dans la programmation en C?En C#:
Le ';' est en option pour assurer la compatibilité ascendante après l'enum bloc. Il ne pas permettre une telle sémantique dans la langue de types nommés. statique, le public, etc. avoir une attention particulière. Espace de noms ne peut pas contenir de membres comme les champs ou méthodes.
Nécessite tag:
En C/C++:
Exige ';' à la fin de l'enum bloc.
Pour l'espace de noms global variables, les énumérations, etc. statique est par défaut.
Je ne sais pas pourquoi statique a été utilisé ou pourquoi elle a même compile. Faut juste être enum Réponse.
Les agents recenseurs sont pas des données statiques.