Comment faire pour passer une énumération de manière cohérente ? - page 6

 
pavlick_:

Une note aux programmeurs :


Maintenant, si nous devons modifier une énumération, nous le faisons une fois et à un seul endroit. Nous devons ajouter un nouvel élément, par exemple element_new = 56, nous ajoutons

Et nous ne prenons pas la peine d'éditer la fonction get_enumqq_array(). Cette technique s'appelle X Macro https://en.wikipedia.org/wiki/X_Macro. Si les développeurs le souhaitent, ils peuvent facilement modifier les énumérations standard de manière similaire.

Peut-être pas immédiatement évidente, l'énumération s'est déroulée de cette façon :

Cool ! Je ne connaissais pas le Macro X, merci ! Je ne comprends pas le code, pourquoi il n'y a pas d'erreur à cause de la virgule à la fin de la définition ENUM_QQ_HELPER. Il ne doit pas y avoir de virgule après le dernier élément lors de la définition d'un enum ou d'un array. Mais le compilateur ne semble pas le jurer pour une raison quelconque.

J'ai essayé

int a[] = {1, 2,};

ça ne sera pas le cas. Et la taille du tableau (enum) est comme il se doit. C'est cool ! Il semble qu'il s'agisse d'un bug, mais je préfère avoir un tel bug. Vraiment, c'est pratique.

 
pourquoi il n'y a pas d'erreur due à une virgule

Eh bien, c'est une violation légitime, surtout pour toutes sortes de "trucs" comme celui-ci, apparemment. Ne vous inquiétez pas, ce n'est pas non plus une erreur en C/C++.

SZZ : dans la norme C++ sur le sujet de l'initialisation :

braced-init-list:

   {initializer-list , opt}

   { }

C'est-à-dire que la virgule à la fin de braced-init-list est légalisée au plus haut niveau.

 
pavlick_:

C'est-à-dire que la virgule à la fin de la liste d'éléments entre crochets est légalisée au plus haut niveau.

Merci, je vais le savoir et l'utiliser.
 
pavlick_:

Une note aux programmeurs :

Qu'en est-il des noms normaux qui sont dans les commentaires ?

 
Комбинатор:

Qu'en est-il des noms normaux qui sont dans les commentaires ?

Puis-je avoir un exemple de l'enum en question ?
 
Комбинатор:

Qu'en est-il des noms normaux qui sont dans les commentaires ?

Oui, l'insertion d'un commentaire ne fonctionne pas. Syntaxe malheureuse pour commenter les enums.

Puis-je avoir un exemple de l'enum en question ?

enum E
{
   a = 1         // вот этот комментарий
}
 
pavlick_:

Oui, cela ne fonctionne pas pour insérer un commentaire. Syntaxe malheureuse pour commenter les énumérations.

Concluez-le par /*...*/.
 
fxsaber:
Concluez-le en /*...*/.
Le non-sens ici est que le préprocesseur ne veut pas manger les commentaires (à la fois // et /*), ne s'attend pas à les voir lors de l'expansion des macros. Soit vous changez les règles du préprocesseur, soit vous introduisez une manière alternative de commenter les énumérations (le commentaire sera affiché lors de l'exécution du script dans les paramètres), comme ceci :

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Je suis déjà impuissant ici.
 
pavlick_:
Le problème ici est que le préprocesseur ne veut pas manger les commentaires (à la fois // et /*), il ne s'attend pas à les voir lorsque les macros sont développées. Soit vous changez les règles du préprocesseur, soit vous introduisez une manière alternative de commenter les énumérations (le commentaire sera affiché lors de l'exécution du script dans les paramètres), comme ceci :

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Je suis déjà impuissant ici.
 

Le prétraitement se fait en plusieurs étapes. Dans un premier temps, tous les commentaires sont supprimés du code source et le résultat est envoyé pour traitement. Et c'est là que le préprocesseur ne s'attend pas à rencontrer un commentaire (lorsqu'il ouvre les macros). Il considérera une telle rencontre comme une erreur. Par exemple, ici :

#define  COMMENT / ## /

void OnStart()
{
  COMMENT
}
À première vue, ce code anodin devrait contenir un commentaire. Mais ça ne compile pas.
Raison: