Come si fa a passare un'enumerazione in modo coerente? - pagina 6

 
pavlick_:

Una nota per i programmatori:


Ora, se abbiamo bisogno di modificare un'enumerazione, la modifichiamo una volta sola e in un solo posto. Abbiamo bisogno di aggiungere un nuovo elemento, per esempio element_new = 56, aggiungiamo

E non ci preoccupiamo di modificare la funzione get_enumqq_array(). La tecnica si chiama X Macro https://en.wikipedia.org/wiki/X_Macro. Se gli sviluppatori lo desiderano, possono facilmente modificare le enumerazioni standard in modo simile.

Forse non immediatamente evidente, l'enumerazione si è rivelata così:

Fico! Non sapevo della X Macro, grazie! Proprio non capisco il codice, perché non c'è errore a causa della virgola alla fine della definizione ENUM_QQ_HELPER. Non ci dovrebbe essere una virgola dopo l'ultimo elemento quando si definisce enum o array. Ma il compilatore non sembra bestemmiare per qualche motivo.

Ho provato

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

non lo farà. E la dimensione dell'array (enum) è come dovrebbe essere. È forte! Sembra essere un bug, ma preferirei avere un bug del genere. Davvero, è conveniente.

 
perché non c'è nessun errore dovuto a una virgola

Beh, è una violazione legittima, specialmente per ogni tipo di "roba" come questa, a quanto pare. Non preoccupatevi, non è un errore neanche in C/C++.

SZZ: nello standard C++ sul tema dell'inizializzazione:

braced-init-list:

   {initializer-list , opt}

   { }

Cioè la virgola alla fine di braced-init-list è legalizzata al livello più alto.

 
pavlick_:

Cioè, la virgola alla fine del braced-init-list è legalizzata al livello più alto.

Grazie, lo saprò e lo userò.
 
pavlick_:

Una nota per i programmatori:

E i nomi normali che si trovano nei commenti?

 
Комбинатор:

E i nomi normali che si trovano nei commenti?

Posso avere un esempio dell'enum in questione?
 
Комбинатор:

E i nomi normali che si trovano nei commenti?

Sì, inserire un commento non funziona. Sintassi infelice per commentare gli enum.

Posso avere un esempio dell'enum in questione?

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

Sì, non funziona per inserire un commento. Sintassi infelice per commentare le enumerazioni.

Concludere con /*...*/.
 
fxsaber:
Concludere in /*...*/.
L'assurdità qui è che il preprocessore non vuole mangiare i commenti (sia // che /*), non si aspetta di vederli quando si espandono le macro. O si cambiano le regole per il preprocessore, o si introduce un modo alternativo per commentare le enumerazioni (il commento sarà visualizzato quando si esegue lo script nelle impostazioni), come questo:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Sono già impotente qui.
 
pavlick_:
Il problema qui è che il preprocessore non vuole mangiare i commenti (sia // che /*), non si aspetta di vederli quando le macro sono espanse. O si cambiano le regole per il preprocessore, o si introduce un modo alternativo per commentare le enumerazioni (il commento sarà visualizzato quando si esegue lo script nelle impostazioni), come questo:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Sono già impotente qui.
 

La pre-elaborazione è fatta in diversi passi. All'inizio, tutti i commenti vengono rimossi dal codice sorgente e il risultato viene inviato per l'elaborazione. Ed è qui che il preprocessore non si aspetta di incontrare un commento (quando apre le macro). Considererà tale incontro come un errore. Per esempio, qui:

#define  COMMENT / ## /

void OnStart()
{
  COMMENT
}
A prima vista, questo codice innocuo dovrebbe contenere un commento. Ma non si compila.