¿Cómo puedo pasar por una enumeración de forma coherente? - página 6

 
pavlick_:

Una nota para los programadores:


Ahora, si necesitamos editar una enumeración, la editamos una vez y en un solo lugar. Necesitamos añadir un nuevo elemento, por ejemplo elemento_nuevo = 56, añadimos

Y no nos molestamos en editar la función get_enumqq_array(). La técnica se llama X Macro https://en.wikipedia.org/wiki/X_Macro. Si los desarrolladores lo desean, pueden modificar fácilmente las enumeraciones estándar de forma similar.

Aunque no sea inmediatamente evidente, la enumeración resultó así:

¡Genial! No conocía el X Macro, ¡gracias! No entiendo el código, por qué no hay error por la coma al final de la definición ENUM_QQ_HELPER. No debe haber una coma después del último elemento cuando se define un enum o un array. Pero parece que el compilador no lo jura por alguna razón.

He intentado

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

no lo hará. Y el tamaño de la matriz (enum) es como debe ser. ¡Es genial! Parece que es un error, pero prefiero que sea así. Realmente, es conveniente.

 
por qué no hay error debido a una coma

Bueno, es una violación legítima, especialmente para todo tipo de "cosas" como esta, aparentemente. No te preocupes, tampoco es un error en C/C++.

SZZ: en la norma C++ sobre el tema de la inicialización:

braced-init-list:

   {initializer-list , opt}

   { }

Es decir, la coma al final de braced-init-list está legalizada al más alto nivel.

 
pavlick_:

Es decir, la coma al final de la lista braceada-init está legalizada al más alto nivel.

Gracias, lo sabré y lo utilizaré.
 
pavlick_:

Una nota para los programadores:

¿Qué pasa con los nombres normales que están en los comentarios?

 
Комбинатор:

¿Qué pasa con los nombres normales que están en los comentarios?

¿Puedo tener un ejemplo del enum en cuestión?
 
Комбинатор:

¿Qué pasa con los nombres normales que están en los comentarios?

Sí, insertar un comentario no funciona. Sintaxis desafortunada para comentar los enums.

¿Puedo tener un ejemplo del enum en cuestión?

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

Sí, no funciona para insertar un comentario. Sintaxis desafortunada para comentar las enumeraciones.

Conclúyalo con /*...*/.
 
fxsaber:
Conclúyalo en /*...*/.
El sinsentido aquí es que el preprocesador no quiere comerse los comentarios (tanto // como /*), no espera verlos cuando se expanden las macros. O bien se cambian las reglas del preprocesador, o se introduce una forma alternativa de comentar las enumeraciones (el comentario se mostrará cuando se ejecute el script en la configuración), como esta:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Ya no tengo poder aquí.
 
pavlick_:
La cuestión aquí es que el preprocesador no quiere comerse los comentarios (tanto // como /*), no espera verlos cuando se expanden las macros. O bien se cambian las reglas del preprocesador, o se introduce una forma alternativa de comentar las enumeraciones (el comentario se mostrará cuando se ejecute el script en la configuración), así:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Ya no tengo poder aquí.
 

El preprocesamiento se realiza en varios pasos. Al principio, se eliminan todos los comentarios del código fuente y se envía el resultado para su procesamiento. Y aquí es donde el preprocesador no espera encontrar un comentario (cuando abre las macros). Considerará dicho encuentro como un error. Por ejemplo, aquí:

#define  COMMENT / ## /

void OnStart()
{
  COMMENT
}
A primera vista, este código inofensivo debería contener un comentario. Pero no se compila.