Como é que passo por uma enumeração de forma consistente? - página 6

 
pavlick_:

Uma nota aos programadores:


Agora, se precisarmos de editar uma enumeração, editamos uma vez e num só lugar. Precisamos de adicionar um novo elemento, por exemplo elemento_novo = 56, adicionamos

E não nos preocupamos com a função de edição get_enumqq_array(). A técnica chama-se X Macro https://en.wikipedia.org/wiki/X_Macro. Se os criadores desejarem, podem facilmente modificar as enumerações padrão de forma semelhante.

Talvez não seja imediatamente óbvio, a enumeração acabou por ser feita desta forma:

Fixe! Eu não sabia da X Macro, obrigado! Apenas não compreendo o código, porque não há erro devido à vírgula no fim da definição ENUM_QQ_HELPER. Não deve haver uma vírgula após o último elemento ao definir enumeração ou matriz. Mas o compilador não parece jurar por alguma razão.

Eu tentei

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

não o fará. E o tamanho da matriz (enumerar) é como deve ser. É fixe! Parece ser um insecto, mas eu preferia ter um tal insecto. Realmente, é conveniente.

 
porque não há erro devido a uma vírgula

Bem, é uma violação legítima, especialmente para este tipo de "coisas", aparentemente. Não se preocupe, também não é um erro em C/C++.

SZZ: em norma C++ sobre o tema da inicialização:

braced-init-list:

   {initializer-list , opt}

   { }

Isto é, a vírgula no final da lista de braced-init-list é legalizada ao mais alto nível.

 
pavlick_:

Ou seja, a vírgula no final da lista de bracede-init é legalizada ao mais alto nível.

Obrigado, vou conhecê-lo e usá-lo.
 
pavlick_:

Uma nota aos programadores:

E os nomes normais que estão nos comentários?

 
Комбинатор:

E os nomes normais que estão nos comentários?

Posso ter um exemplo do enumeral em questão?
 
Комбинатор:

E os nomes normais que estão nos comentários?

Sim, a inserção de um comentário não funciona. Sintaxe infeliz para comentar os enums.

Posso ter um exemplo do enumeral em questão?

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

Sim, não funciona para inserir um comentário. Sintaxe infeliz para comentar as enumerações.

Concluí-lo com /*...*/.
 
fxsaber:
Concluir em /*...*/.
O disparate aqui é que o pré-processador não quer comer comentários (tanto // como /*), não espera vê-los ao expandir as macros. Ou alterar as regras do pré-processador, ou introduzir uma forma alternativa de comentar enumerações (os comentários serão exibidos ao executar o guião em definições), como esta:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Já estou aqui sem poder.
 
pavlick_:
O problema aqui é que o pré-processador não quer comer comentários (tanto // como /*), não espera vê-los quando as macros são expandidas. Ou alterar as regras do pré-processador, ou introduzir uma forma alternativa de comentar enumerações (os comentários serão exibidos ao executar o guião em definições), como esta:

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
Já estou aqui sem poder.
 

O pré-processamento é feito em várias etapas. No início, todos os comentários são retirados do código fonte e o resultado é enviado para processamento. E é aqui que o pré-processador não espera encontrar um comentário (quando abre as macros). Considerará tal encontro como um erro. Por exemplo, aqui:

#define  COMMENT / ## /

void OnStart()
{
  COMMENT
}
À primeira vista, este código inofensivo deve conter um comentário. Mas não se compila.
Razão: