web-dev-qa-db-fra.com

erreur: coller "." et "rouge" ne donne pas de jeton de prétraitement valide

J'implémente la macro X, mais j'ai un problème avec une simple extension de macro. Cette macro (voir ci-dessous) est utilisée dans plusieurs exemples d'utilisation de macros, en incluant dans l'article this . Le compilateur donne un message d'erreur, mais je peux voir un code C valide en utilisant l'indicateur -E Avec le compilateur GCC.

La macro X-list est définie comme suit:

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

Puis:

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

Mais le gcc a donné les messages d'erreur suivants:

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

Comme je l'ai dit, je peux voir un code C valide en utilisant le commutateur -E Sur 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;;

Qu'est-ce qu'un jeton de prétraitement valide? Quelqu'un peut-il expliquer cela?

(avant de dire "pourquoi pas juste une initialisation ou une memset()?" ​​ce n'est pas mon vrai code.)

34
Jack

. sépare les jetons et vous ne pouvez donc pas utiliser ## comme .red n'est pas un jeton valide. Vous utiliseriez uniquement ## si vous concaténiez deux jetons en un seul.

Cela marche:

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

Qu'est-ce qu'un jeton de prétraitement valide? Quelqu'un peut-il expliquer cela?

C'est ce qui est analysé/lexé. foo.bar serait analysé comme 3 jetons (deux identifiants et un opérateur): foo . bar Si tu utilises ## vous obtiendrez seulement 2 jetons (un identifiant et un jeton invalide): foo .bar

44
Pubby