uso signos puntuacion puntos punto funciones enumeraciones enumeracion ejemplos compleja coma c syntax enums

signos - ¿Se requiere la última coma en enumeración?



uso de la coma ejemplos (12)

Como todos los demás dicen, la coma no es necesaria. Pero es nuevo en C99 (no se permitió en C89) y también se permitirá en la próxima versión de C ++.

Otra razón es hacer una diferencia entre un enumerador de "longitud" y un enumerador normal:

enum Items { A, B, C, LENGTH };

Ahora, puede incluir en su guía de codificación que el último elemento de su enumeración debe tener una coma aplicada, pero no si es un elemento de "Longitud", que solo indica cuántos elementos hay.

También ayuda para la generación automática de elementos (utilizando macros / preprocesadores) como explican otras respuestas.

¿Se requiere la última coma en una declaración de enumeración de C?

es decir, se requiere la coma después de VAL3 ?

enum { Val1, Val2, Val3, } someEnum;

¿Hay efectos secundarios de dejarlo dentro / fuera?

Gracias


Como ya se ha indicado no es obligatorio. La razón por la que se admite una coma al final es que (asumiendo que los elementos están dispuestos uno por línea) le permite reorganizar convenientemente el orden de los elementos en una enumeración usando cortar / pegar o arrastrar / soltar, y también le permite comentar el último elemento sin producir un error de sintaxis. Omitir la coma final es legal pero pierde estas ventajas de mantenimiento del código.

Lo había olvidado pero Nick tiene toda la razón. Yo también he explotado la coma final con las directivas del compilador. Sin él, el código condicional hubiera sido mucho más complicado y difícil de leer.


El final , en una definición de enum o inicializador de matriz es opcional, pero bastante útil, especialmente en listas que abarcan varias líneas. Se permite desde C99 por razones de simetría, ya que otorga a todas las líneas la misma estructura para cada elemento:

enum DAY { MON = 1, TUE, WED, THU, FRI, SAT, SUN, };

Facilita la generación de contenidos de matriz con scripts y evita situaciones propensas a errores donde agregar elementos adicionales a una matriz pero olvidando agregar una coma puede pasar desapercibido:

const char *osnames[] = { "CP/M", "MS/DOS", "Windows" }

Añadiendo elementos extra:

const char *osnames[] = { "CP/M", "MS/DOS", "Windows" "Linux", "OS/X" };

Observe la coma que falta en el medio de la lista: el compilador analiza la tercera cadena como "WindowsLinux" y el error no genera un error de sintaxis.

Con el final , en cada línea, es mucho más fácil agregar y eliminar elementos sin modificar otras líneas. Es incluso más útil si las líneas se compilan condicionalmente como en este ejemplo:

const char *osnames[] = { "CP/M", "MS/DOS", "Windows", #ifdef __UNIX__ "Linux", "OS/X", #endif };


En la norma C89, la última coma no está permitida. Parada completa

Era una extensión común para permitirlo; en particular, fue apoyado por GCC, pero el estándar lo rechazó expresamente.

En el estándar C99, se permite la última coma, para simetría con inicializadores de matriz y estructura, lo que siempre permitió la coma al final del último elemento.

6.7.2.2 Especificadores de enumeración

Sintaxis

enum-specifier: enum identifieropt { enumerator-list } enum identifieropt { enumerator-list , } enum identifier

La principal ventaja de permitir comas finales es que permite la generación más fácil de la máquina de código (fuente C) - no tiene que escribir un código de caso especial para el último (o, quizás, el primer) elemento en la lista de inicializadores. Por lo tanto, los programas como Yacc y Lex, por nombrar solo dos, pueden ser un poco más simples.


Es opcional y útil, por ejemplo, si usas macro, por ejemplo.

#ifdef _FLAG #define OPTS opt_four, opt_five, #else #define OPTS // none #endif enum { opt_one, opt_two, opt_three, OPTS };


No es necesario, de hecho algunos compiladores se quejan si agrega uno. por ejemplo, Visual Studio 6.
Un uso de la coma es para crear enumeraciones usando macros c.

#define ELEMENT(x) x, enum MyElements { ELEMENT(a) ELEMENT(b) ELEMENT(c) };

Este patrón es útil si hay varias cosas que debe hacer con los elementos y solo desea definirlas una vez. Para ver un ejemplo más completo de esto, puede consultar el código de libiconv y la utilidad iconv.


No es necesario. La sección 6.7.2.2 de C99 enumera la sintaxis como:

enum-specifier: enum identifieropt { enumerator-list } enum identifieropt { enumerator-list , } enum identifier enumerator-list: enumerator enumerator-list , enumerator enumerator: enumeration-constant enumeration-constant = constant-expression

Observe las dos primeras formas de enum-specifier , una con la coma al final y otra sin.

Una de las ventajas que he visto usarlo es en cosas como:

enum { Val1, Val2, Val3, } someEnum;

donde, si desea agregar (por ejemplo) Val4 y Val5 , simplemente copie y pegue la línea Val3 sin tener que preocuparse por ajustar las comas.

Y, como se señaló en un comentario, también puede ser simplificar los generadores de código automatizados para que no tengan que tener un manejo especial para el valor final. Solo pueden generar cada valor seguido de una coma.

Esto se puede comparar con el SQL que se ve a menudo:

select fld1, fld2 from tbl where 1=1 and fld1 > 8

En ese caso, where 1=1 está allí solo para que no tenga que poner where antes su primera cláusula y una and cada una posterior. Solo puede confiar en el hecho de que ya está allí y solo usar and para todos los que agregue.

Algunas personas pueden pensar que esto apesta a pereza y tienen razón, pero eso no es necesariamente algo malo :-)

Cualquier optimizador de consultas DBMS decente debería ser capaz de eliminar una cláusula constante como esa antes de ir a las tablas de la base de datos.


No se requiere la última coma final.

Prefiero las comas finales por dos razones:

  1. Limpiar git diffs .
  2. Fácil edición en editores con comandos basados ​​en líneas (por ejemplo, el dd de Vim).

No, no es necesario. La razón es que lo hace más fácil a los fines de cortar y pegar el código, si no tiene que preocuparse por si la coma debe estar allí o no.


No, no es obligatorio y debe omitirse para la claridad del código. Su presencia / ausencia no tiene efecto.


No, no es obligatorio, de hecho, diría que tenerlo es malo.


Otras respuestas lo mencionan, pero me gustaría resaltar que la coma final no está permitida en C89 y C ++ que cumplen con los estándares, lo que hace que sea un problema de portabilidad con compiladores antiguos o poco comunes. Aquí hay un enlace útil que explica este y muchos otros problemas de C / C ++: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl