Est la dernière virgule en C enum nécessaire?
Est la dernière virgule nécessaire dans un enum C déclaration?
c'est à dire la virgule après VAL3
nécessaire?
enum { Val1, Val2, Val3, } someEnum;
Sont-ils des effets secondaires de la laisser sortir/
Grâce
- Dans la norme C89, la dernière virgule était explicitement interdit. En C99, on le permet. Les effets secondaires de la laisser en est qu'il ne peut pas être compilé par le strict C89 compilateurs.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas nécessaire. Section
6.7.2.2
de C99 listes de la syntaxe:Avis les deux premières formes de
enum-specifier
, l'un avec la virgule et l'autre sans.Un avantage que j'ai vu à l'aide de c'est dans des choses comme:
où, si vous souhaitez ajouter dans (par exemple)
Val4
etVal5
, il vous suffit de copier et coller leVal3
ligne sans avoir à vous inquiéter au sujet de l'adaptation des virgules.Et, comme l'a fait remarquer dans un commentaire, il peut aussi être de simplifier automatisé des générateurs de code, de sorte qu'ils n'ont pas à avoir un traitement spécial à la valeur finale. Ils peuvent juste sortie de chaque valeur suivie par une virgule.
Ce qui peut être assimilé à l'oft vu SQL:
Dans ce cas, le
where 1=1
est-il seulement de sorte que vous n'avez pas à mettre unwhere
avant votre premier paragraphe et unand
avant chaque un. Vous pouvez simplement compter sur le fait que lawhere
est déjà là et il suffit d'utiliserand
pour tous ceux que vous ajoutez.Certaines personnes peuvent penser que cela pue de la paresse et ils ont raison, mais ce n'est pas nécessairement une mauvaise chose 🙂
Tout décent SGBD optimiseur de requête devrait être en mesure de sortir la bande constante de la clause comme ça avant d'aller sur les tables de base de données.
Comme tout le monde le dit, la virgule n'est pas nécessaire. Mais il y a de nouveau dans C99 (n'était pas autorisé en C89) et sera autorisé dans la prochaine version de C++ aussi.
Une autre justification est de faire une différence entre une "longueur" énumérateur et de normal enquêteur:
Maintenant, vous pouvez mettre dans votre codage de ligne directrice que le dernier élément dans votre énumération doit avoir une virgule appliqués, mais pas si c'est une "Longueur" de l'élément qui indique simplement le nombre d'éléments.
Il aide également pour la génération automatique d'articles (à l'aide de macros/préprocesseurs) comme d'autres réponses expliquer.
Dans la norme C89, la dernière virgule n'est pas autorisée. Arrêt complet.
C'était une extension commune à l'autoriser; en particulier, il a été pris en charge par GCC, mais la norme expressément refusé il.
Dans la norme C99, la dernière virgule est autorisé, par symétrie avec le tableau et la structure des initialiseurs, qui a toujours fait de permettre à la virgule sur le dernier élément.
Le principal avantage de permettre des virgules, c'est qu'il permet de faciliter la machine de génération de (source C) le code - vous n'avez pas à écrire des cas spécial de code pour le dernier (ou peut-être la première) de l'élément dans la liste des initialiseurs. Par conséquent, les programmes comme Yacc et Lex, pour n'en citer que deux, peut-être un peu plus simple.
Non, il n'est pas nécessaire. La raison d'être, c'est plus facile pour les fins de couper et de coller le code, si vous n'avez pas besoin de s'inquiéter de savoir si la virgule est destiné à être là ou pas.
Non, il n'est pas nécessaire, en fait, je dirais que de l'avoir il y a de mauvais style.
Comme déjà indiqué, il n'est pas nécessaire. La raison qu'une virgule est pris en charge, c'est que (en supposant que les éléments sont disposés l'un à la ligne), il vous permet de facilement changer l'ordre des éléments d'une énumération en utilisant la fonction couper/coller ou glisser/déposer, et il vous permet également de commenter le dernier élément sans produire une erreur de syntaxe. L'omission de la virgule est légal, mais perd ces la maintenance de votre code avantages.
J'avais oublié mais Nick est tout à fait juste. Moi aussi, j'ai exploité la virgule avec des directives de compilation. Sans elle, le code conditionnel aurait été beaucoup messier et plus difficile à lire.
Il est facultatif et utile, si par exemple vous utilisez une macro, par exemple
La dernière virgule n'est pas nécessaire.
Je préfère virgules pour deux raisons:
dd
).Non, il n'est pas nécessaire et devrait être omis dans le code de la clarté. Sa présence/absence n'a pas d'effet.
Ses pas nécessaire, en fait certains compilateurs se plaindre si vous vous en ajouter un. par exemple Visual Studio 6.
Une utilisation de la virgule pour créer des énumérations à l'aide de c macros.
Ce modèle est utile si vous il ya plusieurs choses que vous devez faire avec les éléments et ne veulent définir une seule fois. Pour un exemple plus complet de ce que vous pouvez regarder le code de la libiconv et l'utilitaire iconv.
#define ALL_ELEMENTS(ELEMENT) ELEMENT(a) ELEMENT(b) ELEMENT(c)
. Ensuite, vous#define ELEMENT
à ce que vous avez besoin à un moment donné, puis d'appeler laALL_ELEMENTS
macro.D'autres réponses de le mentionner, mais je voudrais juste souligner que la virgule est rejetée dans les normes conformes C89 et C++, ce qui en fait une portabilité de problème avec l'ancien ou rare compilateurs. Voici un bon lien qui explique cela et beaucoup d'autres C/C++ questions: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl
La fuite
,
dans unenum
définition ou d'initialiseur de tableau est facultatif, mais très utile, surtout dans les listes s'étendant sur plusieurs lignes. Il est admis depuis C99 pour des raisons de symétrie, car il donne toutes les lignes de la même structure pour chaque élément:Il le rend plus facile à générer du contenu du tableau à l'aide de scripts et évite les risques d'erreurs des situations où l'ajout d'éléments à un tableau mais en oubliant d'ajouter une virgule peut passer inaperçue:
L'ajout d'éléments supplémentaires:
Avis le manque de virgule dans le milieu de la liste: le compilateur traite de la troisième corde comme
"WindowsLinux"
et le bug ne génère pas une erreur de syntaxe.Avec la fuite
,
sur chaque ligne, il est beaucoup plus facile d'ajouter et de supprimer des éléments sans modifier d'autres lignes. Il est encore plus utile si les lignes sont compilées de façon conditionnelle, comme dans cet exemple: