2009-04-27 15 views
20

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

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

enum{Val1, Val2, Val3,} someEnum; 

¿Hay efectos secundarios de la dejándolo in/out

Gracias

+9

En el estándar C89, esa última coma estaba explícitamente prohibida. En C99, lo permiten. El efecto secundario de dejarlo es que no puede ser compilado por estrictos compiladores C89. –

Respuesta

36

No es necesario. Sección 6.7.2.2 de C99 muestra 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 

Aviso las dos primeras formas de enum-specifier, una con la coma final y otro sin él.

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

enum { 
    Val1, 
    Val2, 
    Val3, 
} someEnum; 

donde, si desea agregar en (por ejemplo) Val4 y Val5, sólo tienes que copiar y pegar la línea Val3 sin tener que preocuparse por ajustar las comas.

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

Esto se puede comparar a la de SQL menudo visto-:

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

En ese caso, el where 1=1 está allí sólo para que usted no tiene que poner un where antes de su primera cláusula y una and antes cada uno posterior. Puede confiar en el hecho de que el where ya está allí y simplemente use and para todos los que agregue.

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

cualquier DBMS consulta optimizador decente debe ser capaz de despojar a cabo cláusula constante de esa manera antes de ir a las tablas de la base de datos.

+8

Otro razonamiento que escuché es el código generado por la máquina: un caso de esquina menos necesario en el generador de código. –

1

No, no es obligatorio y debe ser omitido para mayor claridad código. Su presencia/ausencia no tiene efecto.

+2

Sería mucho más preciso decir que una coma final no tiene valor semántico. Su ausencia puede hacer que el mantenimiento del código sea menos conveniente. ¿De qué manera la ausencia de una coma final aclara el código? –

+0

Cuando el último elemento de la enumeración es seguido por un paréntesis inmediatamente se ve más claro para mí. Es subjetivo, supongo. – sharptooth

3

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

4

No, no es obligatorio. El motivo es que facilita el uso del código de cortar y pegar, si no necesita preocuparse acerca de si la coma debe estar allí o no.

3

Como ya se ha indicado, no es necesario. La razón por la que se admite una coma final es que (suponiendo que los elementos se distribuyan uno en una 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 razón. Yo también he explotado la coma final con las directivas del compilador. Sin él, el código condicional habría sido mucho más complicado y difícil de leer.

2

Es opcional y útil, por ejemplo, si usa macro, p. Ej.

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

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

#define ELEMENT(x) x, 

enum MyElements { 
    ELEMENT(a) 
    ELEMENT(b) 
    ELEMENT(c) 
}; 

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

+0

Esto es malo. ¿Por qué no usar: "#define ELEMENT (x) x" y luego agrega las comas en la enumeración? – nilton

+1

La idea es que los contenidos de la enumeración son en sí mismos otra macro: '#define ALL_ELEMENTS (ELEMENT) ELEMENT (a) ELEMENT (b) ELEMENT (c)'. Luego '#define ELEMENT' a lo que necesite en un momento determinado y luego invoque la macro 'ALL_ELEMENTS'. –

14

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

Otra razón es para hacer una diferencia entre un empadronador "longitud" y un empadronador normales:

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

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

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

+3

Es una pena que el modismo LENGTH interrumpa la comprobación automática de la integridad del interruptor (enum). –

7

En el estándar C89, la última coma no está permitida. Punto final.

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

En el estándar C99, se permite la última coma, por simetría con los inicializadores de matriz y estructura, que siempre permiten la coma final en el ú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 que comas finales es que permite la generación de la máquina más fácil (fuente de C) de código - que no tiene para escribir el código de caso especial para el último elemento (o, tal vez, el primero) en la lista de inicializadores. Por lo tanto, programas como Yacc y Lex, por nombrar solo dos, pueden ser un poco más simples.

0

Otras respuestas lo mencionan, pero me gustaría resaltar que la coma final no está permitida en C89 y C++, lo que la convierte en un problema de portabilidad con compiladores antiguos o no 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

1

No se requiere la última coma final.

prefiero comas finales por dos razones:

  1. Limpio git diffs.
  2. Edición fácil en editores con comandos basados ​​en línea (por ejemplo, Vim dd).