ti-enxame.com

erro: colando "." e "red" não fornece um token de pré-processamento válido

Estou implementando a macro X, mas tenho um problema com uma simples expansão de macro. Essa macro (veja abaixo) é usada em vários exemplos de uso de macros, incluindo no artigo this . O compilador fornece uma mensagem de erro, mas posso ver o código C válido usando o sinalizador -E Com o compilador GCC.

A macro X-list é definida da seguinte maneira:

#define LIST \
  X(red, "red") \
  X(blue, "blue") \
  X(yellow, "yellow")

E depois:

#define X(a, b) foo.##a = -1;
  LIST;
#undef X

Mas o gcc recebeu as seguintes mensagens de erro:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token

Como eu disse, posso ver o código C válido usando a opção -E No gcc:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
  foo.red = -1; foo.blue = -1; foo.yellow = -1;;

O que é um token de pré-processamento válido? Alguém pode explicar isso?

(antes de você dizer "por que não apenas inicializar ou memset()?", esse não é o meu código real.)

34
Jack

. separa tokens e, portanto, você não pode usar ## Como .red não é um token válido. Você usaria apenas ## se você estivesse concatenando dois tokens em um único.

Isso funciona:

#define X(a, b) foo.a = -1;

O que é um token de processamento adequado? Alguém pode explicar isso?

É o que é analisado/lexado. foo.bar seria analisado como 3 tokens (dois identificadores e um operador): foo . bar Se você usar ## você obteria apenas 2 tokens (um identificador e um token inválido): foo .bar

44
Pubby